逆アセンブリを表示するために使用したカスタムQtウィジェットがあり、構文の色付けを追加しようとしています。
現在、をQPen
単色に設定し、表示したいテキストを作成してQPainter
、適切な座標でレンダリングするだけです。
問題は、構文の色付けを追加するための最良のアプローチは何ですか?私はいくつか考えました:
- 単純に色を論理ブロックに分割し、それぞれの前にQPenを目的の色に設定することができます。
- カラーパレットの変更を表す特別なエスケープ文字を使用して、一度に1文字ずつレンダリングすることができます。
- #1を変更してリストを作成し、リストを
std::pair<QColor, QString>
繰り返して色を設定し、リストの先頭からアイテムをポップしながらテキストを描画するだけで済みます。 - まったく違うもの?
私がリストした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();