C++ QPaint彩色文本(语法着色)
我有一个自定义的Qt小部件,我用它来显示反汇编,我想给它添加语法着色 目前,我只需将C++ QPaint彩色文本(语法着色),c++,qt,syntax-highlighting,qpainter,C++,Qt,Syntax Highlighting,Qpainter,我有一个自定义的Qt小部件,我用它来显示反汇编,我想给它添加语法着色 目前,我只需将QPen设置为纯色,构建要显示的文本,并在适当的坐标处将其渲染到QPainter 问题是,添加语法着色的最佳方法是什么?我想到了一些: 我可以简单地将颜色划分为逻辑块,每个逻辑块之前都将QPen设置为所需的颜色 我可以使用特殊的转义字符来表示调色板中的更改,并一次渲染一个字符 我可以修改#1并创建一个std::pair列表,然后我可以简单地迭代列表设置颜色并在列表前面弹出项目时绘制文本 完全不同的东西 我知道我列
QPen
设置为纯色,构建要显示的文本,并在适当的坐标处将其渲染到QPainter
问题是,添加语法着色的最佳方法是什么?我想到了一些:
std::pair
列表,然后我可以简单地迭代列表设置颜色并在列表前面弹出项目时绘制文本QSyntaxHighlighter
和QTextDocument
。主要的问题是,这些通常不适合我的目的。我有几根柱子,它们都有分隔器,可以前后滑动。为了给你一个想法,这里有一个链接。正如您所看到的,它根本不像一个文本文档。事实上,它更接近于列表或表格。但是已经有很多自定义绘图正在进行,使得普通的QTextDocument
有些不切实际
编辑:我不正确,似乎QTextDocument
可以直接渲染到QPainter
。看来是我需要的
编辑:不清楚如何控制QTextDocument
或QTextLayout
在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
上的文档提供了一个示例,演示了如何实现这一点,并做了一些好事:
- 将模型与表示分离
- 将格式划分为不同的可重用类(如果这样实现)
- 如果对您的语言有用,则支持设计模式