c++ - QPainter彩色文本(语法着色)

标签 c++ qt syntax-highlighting qpainter

我有一个自定义的 Qt 小部件,我用它来显示反汇编,我希望为其添加语法着色。

目前,我只是设置 QPen为纯色,构造我想要显示的文本,并将其渲染到 QPainter在适当的坐标处。

问题是,添加语法着色的最佳方法是什么?我想到了一些:

  1. 我可以简单地将颜色划分为逻辑 block ,在每个逻辑 block 之前将 QPen 设置为所需的颜色。
  2. 我可以使用特殊的转义字符来表示调色板的变化,并一次渲染 1 个字符。
  3. 我可以对 #1 进行修改并创建 std::pair<QColor, QString> 的列表,然后我可以简单地迭代列表,设置颜色并在从列表前面弹出项目时绘制文本。
  4. 完全不同的东西?

我知道我列出的 3 种方法在技术上都是可行的,但我正在寻找一种非常有效的解决方案。这段代码会被很多人调用。由于这是一个交互式调试器,如果此代码很慢,快速单步执行或跟踪的人会看到明显的速度减慢。

编辑:我知道QSyntaxHighlighterQTextDocument 。主要问题是这些通常不太适合我的目的。我有几根立柱,它们都有分隔板,可以前后滑动。为了给您一个想法,这里有一个 screenshot of my debugger 的链接。正如您所看到的,它根本不像文本文档。事实上它更接近于列表或表格。但是已经有一堆自定义绘图正在制作正常的 QTextDocument有点不切实际。

编辑:我错了,看来QTextDocument可以直接渲染到QPainter 。看起来像我需要的!

编辑:尚不清楚如何控制位置和方式QTextDocumentQTextLayout将绘制 QPainter 。我尝试使用它们但没有成功。因此,如果有人可以提供一个基本的示例,那将会非常有帮助。

编辑:我最终能够使用这样的东西得到我想要的东西:

painter.setPen(default_color);
QTextDocument doc;
doc.setDefaultFont(font());
doc.setDocumentMargin(0);
doc.setPlainText(text);
highlighter_->setDocument(&doc);

painter.save();
painter.translate(x, y);
QAbstractTextDocumentLayout::PaintContext context;
context.palette.setColor(QPalette::Text, painter.pen().color());
doc.draw(&painter, context);
painter.restore();

最佳答案

Qt 提供了 QSyntaxHighlighter这可能正是您想要的。 QSyntaxHighlighter 使用 QTextDocument用特定状态标记每个代码块,该状态可以与特定演示文稿相关联 format .

QSyntaxHighlighter 上的文档提供了一个示例,演示了如何实现这一点并做了一些不错的事情:

  • 将模型与表示分离
  • 将格式分为不同的可重用类(如果这样实现)
  • 支持 State设计模式(如果对您的语言有用)

关于c++ - QPainter彩色文本(语法着色),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/917391/

相关文章:

c++ - Stringstream 将值读入 double 失败?

C++/XCode - 类型 'const double' 的绑定(bind)值引用类型 'double' 删除 'const' 限定符

c++ - 在 QModelIndex 中存储两种不同的类型

c++ - 带有 OpenCV 的 Qt Creator 中的错误代码 0xc0000135

c++ - 使用 Qt 和 QSortFilterProxyModel 实现不同的 View

java - 使用 Span 在 android EditText 上突出显示语法?

c++ - 这是动态绑定(bind)还是静态绑定(bind)?

javascript - Rich文本输入框-溢出问题

regex - HTML 标记中语法高亮属性的正则表达式

c++ - LoadString、静态库和可执行文件