2

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

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

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

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

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

编辑:我知道QSyntaxHighlighterand QTextDocument。主要问题是这些通常不太适合我的目的。我有几列都有分隔线,可以来回滑动。为了给您一个想法,这是我的调试器屏幕截图的链接。如您所见,它根本不像一个文本文档。事实上,它更接近于列表或表格。但是已经有一堆自定义绘图正在进行,使正常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();
4

2 回答 2

5

Qt 提供了一个QSyntaxHighlighter可能正是你想要的。 QSyntaxHighlighter使用 aQTextDocument来标记具有特定状态的每个代码块,该状态可以与特定的表示格式相关联。

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

  • 将模型与演示分开
  • 将格式分成不同的可重用类(如果这样实现)
  • 如果对您的语言有用,则支持State设计模式
于 2009-05-27T19:21:13.377 回答
0

我会使用QTextEdit或直接为其下划线引擎QTextDocument

于 2009-05-27T19:21:16.853 回答