C++ QPaint彩色文本(语法着色)

C++ QPaint彩色文本(语法着色),c++,qt,syntax-highlighting,qpainter,C++,Qt,Syntax Highlighting,Qpainter,我有一个自定义的Qt小部件,我用它来显示反汇编,我想给它添加语法着色 目前,我只需将QPen设置为纯色,构建要显示的文本,并在适当的坐标处将其渲染到QPainter 问题是,添加语法着色的最佳方法是什么?我想到了一些: 我可以简单地将颜色划分为逻辑块,每个逻辑块之前都将QPen设置为所需的颜色 我可以使用特殊的转义字符来表示调色板中的更改,并一次渲染一个字符 我可以修改#1并创建一个std::pair列表,然后我可以简单地迭代列表设置颜色并在列表前面弹出项目时绘制文本 完全不同的东西 我知道我列

我有一个自定义的Qt小部件,我用它来显示反汇编,我想给它添加语法着色

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

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

  • 我可以简单地将颜色划分为逻辑块,每个逻辑块之前都将QPen设置为所需的颜色
  • 我可以使用特殊的转义字符来表示调色板中的更改,并一次渲染一个字符
  • 我可以修改#1并创建一个
    std::pair
    列表,然后我可以简单地迭代列表设置颜色并在列表前面弹出项目时绘制文本
  • 完全不同的东西
  • 我知道我列出的3种方法中的每一种在技术上都是可行的,但我正在寻找一种非常有效的解决方案。这段代码将被大量调用。由于这是一个交互式调试器,如果这段代码很慢,快速执行或跟踪的人会看到明显的速度减慢

    编辑:我知道
    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
    上的文档提供了一个示例,演示了如何实现这一点,并做了一些好事:

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

    我会使用或直接使用它的下划线引擎。

    还有,你为什么要在社区维基上找到答案?你的答案不会得到代表分数…哇,我刚刚注意到QTextDocument有一个drawContents,它会绘制到QPainter。现在这很有帮助!我想我们可能会有赢家。回复:社区维基。。。因为我还是一个傻瓜,正在努力弄清楚它是如何工作的:(.谢谢你的提醒!