我有一个定制的qt小部件,用于显示反汇编,我希望为它添加语法着色。
目前,我只需设置
QPen
对于纯色,构造要显示的文本,并将其呈现到
QPainter
在适当的坐标。
问题是,添加语法着色的最佳方法是什么?我想了几个:
-
我可以简单地将颜色划分为逻辑块,每个块前面都将qpen设置为所需的颜色。
-
我可以使用特殊的转义字符来表示调色板中的更改,并一次呈现一个字符。
-
我可以修改1并创建
std::pair<QColor, QString>
然后我可以简单地迭代列表设置颜色,并在列表前面弹出项目时绘制文本。
-
完全不同的东西?
我知道我列出的三种方法在技术上都是可行的,但我正在寻找一种非常有效的解决方案。这个代码将被称为很多。由于这是一个交互式调试器,如果这段代码很慢,那么快速单步执行或跟踪的人会看到明显的速度减慢。
编辑:
我知道
QSyntaxHighlighter
和
QTextDocument
. 主要的问题是,这些通常不能很好地满足我的目的。我有几根柱子,都有隔板,可以前后滑动。为了给你一个主意,这里有一个链接
screenshot of my debugger
. 正如你所看到的,它根本不像一个文本文档。实际上,它更接近于一个列表或表。但是已经有一堆自定义绘图在进行
qTrk文档
有点不切实际。
编辑
:我错了,似乎
qTrk文档
可以直接渲染到
Q画师
. 看起来像我需要的!
编辑
:不清楚如何控制地点和方式
qTrk文档
或
QTextLayout
将画上
Q画师
. 我试着用它们却无济于事。所以如果有人能提供一个基本的例子,那将是非常有帮助的。
编辑
:我最终能用这种方法得到我想要的东西:
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();