2

逆アセンブリを表示するために使用したカスタムQtウィジェットがあり、構文の色付けを追加しようとしています。

現在、をQPen単色に設定し、表示したいテキストを作成してQPainter、適切な座標でレンダリングするだけです。

問題は、構文の色付けを追加するための最良のアプローチは何ですか?私はいくつか考えました:

  1. 単純に色を論理ブロックに分割し、それぞれの前にQPenを目的の色に設定することができます。
  2. カラーパレットの変更を表す特別なエスケープ文字を使用して、一度に1文字ずつレンダリングすることができます。
  3. #1を変更してリストを作成し、リストをstd::pair<QColor, QString>繰り返して色を設定し、リストの先頭からアイテムをポップしながらテキストを描画するだけで済みます。
  4. まったく違うもの?

私がリストした3つのアプローチのそれぞれが技術的に機能することは知っていますが、私は非常に効率的な解決策を探しています。このコードはたくさん呼ばれます。また、これは対話型デバッガーであるため、このコードが遅い場合、誰かがすばやくステップまたはトレースすると、目に見える速度低下が見られます。

編集:私は知っていますQSyntaxHighlighterQTextDocument。主な問題は、これらは一般的に私の目的にあまり適していないということです。私はいくつかの柱を持っていますが、それらはすべて仕切りがあり、前後にスライドさせることができます。あなたにアイデアを与えるために、ここに私のデバッガーのスクリーンショットへのリンクがあります。ご覧のとおり、テキストドキュメントとはまったく異なります。実際、それはリストまたはテーブルに近いです。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();
4

2 に答える 2

5

Qtは、QSyntaxHighlighterおそらくまさにあなたが望むものを提供します。 QSyntaxHighlighterを使用して、特定のプレゼンテーション形式QTextDocumentに関連付けることができる特定の状態でコードの各ブロックをマークします。

のドキュメントQSyntaxHighlighterは、これがどのように達成されるかを示すサンプルを提供し、いくつかの素晴らしいことを行います。

  • モデルをプレゼンテーションから分離します
  • フォーマットを異なる再利用可能なクラスに分割します(そのように実装されている場合)
  • 言語に役立つ場合は、 Stateデザインパターンをサポートします
于 2009-05-27T19:21:13.377 に答える
0

QTextEditを使用するか、下線を引くエンジンQTextDocumentを直接配置します。

于 2009-05-27T19:21:16.853 に答える