Python & PySide2でできるQt GUIプログラミング:QSyntaxHighlighterを使った応用的な構文強調


QSyntaxHighlighter::document() メソッドは、Qt GUIライブラリにおいて、QSyntaxHighlighter オブジェクトが関連付けられている QTextDocument オブジェクトを取得するために使用されます。

詳細

QSyntaxHighlighter クラスは、テキストエディタやソースコードエディタなどのリッチテキストエディタにおける構文強調機能を提供するために使用されます。QSyntaxHighlighter オブジェクトは、特定の規則に基づいてテキストブロックのフォーマットを設定することで、コードやテキストを読みやすくします。

QSyntaxHighlighter::document() メソッドは、QSyntaxHighlighter オブジェクトが現在関連付けられている QTextDocument オブジェクトへのポインタを返します。この QTextDocument オブジェクトは、QSyntaxHighlighter オブジェクトが強調処理するテキストを含むものです。

QSyntaxHighlighter highlighter;
QTextDocument document;

// テキストをドキュメントに追加
document.setPlainText("This is an example of syntax highlighting.");

// ハイライト処理を行うドキュメントを設定
highlighter.setDocument(&document);

// ドキュメントを取得
QTextDocument *currentDocument = highlighter.document();

// ドキュメントの内容を確認
qDebug() << currentDocument->toPlainText();

この例では、highlighter オブジェクトが document オブジェクトに関連付けられ、そのテキストが強調処理されます。その後、QSyntaxHighlighter::document() メソッドを使用して、currentDocument 変数に document オブジェクトへのポインタが取得されます。最後に、currentDocument 変数の内容を出力することで、document オブジェクトに含まれるテキストを確認することができます。

  • QSyntaxHighlighter::setDocument() メソッドを使用して、QSyntaxHighlighter オブジェクトを別の QTextDocument オブジェクトに関連付けることができます。
  • QSyntaxHighlighter::document() メソッドは、const メソッドであるため、QTextDocument オブジェクトを変更することはできません。
  • QSyntaxHighlighter オブジェクトは、1 つの QTextDocument オブジェクトにしか関連付けられません。


ハイライト処理クラスの定義

import sys
from PySide2.QtWidgets import QApplication, QMainWindow, QTextEdit, QSyntaxHighlighter

class Highlighter(QSyntaxHighlighter):
    def __init__(self, parent):
        super().__init__(parent)

        # パターンとフォーマットを定義
        self.patterns = {
            r"\bkeyword\b": Qt.cyan,
            r"\bfunction\b": Qt.blue,
            r"\d+": Qt.magenta
        }

    def highlightBlock(self, text):
        # パターンごとにテキストを処理
        for pattern, color in self.patterns.items():
            format = QTextCharFormat()
            format.setForeground(color)
            for match in re.finditer(pattern, text):
                self.setFormat(match.start(), match.end() - match.start(), format)

テキストエディタの定義

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        # テキストエディタを作成
        self.textEdit = QTextEdit()

        # ハイライト処理オブジェクトを作成
        self.highlighter = Highlighter(self.textEdit)

        # レイアウトを設定
        self.setCentralWidget(self.textEdit)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

コードの説明

ハイライト処理クラス

  • highlightBlock() メソッド:
    • re.finditer() 関数を使用して、テキスト内のパターンを検索します。
    • 一致が見つかったら、setFormat() メソッドを使用して、一致する部分のフォーマットを設定します。
  • __init__() メソッド:
    • patterns 辞書を使用して、パターンとそれに対応するフォーマットを定義します。

テキストエディタ

  • __init__() メソッド:
    • テキストエディタ (self.textEdit) とハイライト処理オブジェクト (self.highlighter) を作成します。
    • レイアウトを設定します。

実行方法

上記コードを保存し、python filename.py とコマンドを実行してプログラムを実行します。テキストエディタが開き、入力したテキストが定義されたパターンに従って強調処理されます。

  • パターンとフォーマットをカスタマイズすることで、さまざまな種類のテキストを強調処理することができます。
  • このコードはあくまで基本的な例であり、より複雑な構文強調機能を実装するために拡張することができます。


代替方法

  • document() メソッドを使用する親クラスから取得する

QSyntaxHighlighter クラスは、QWidget クラスを継承しています。そのため、QSyntaxHighlighter オブジェクトの親クラスである QWidget オブジェクトから document() メソッドを使用して QTextDocument オブジェクトを取得することができます。

QSyntaxHighlighter highlighter;
QTextDocument *document = highlighter.parentWidget()->document();

この方法の利点は、QSyntaxHighlighter オブジェクトが直接 QTextDocument オブジェクトにアクセスできない場合でも、QTextDocument オブジェクトを取得できることです。

  • findChild() メソッドを使用して QTextDocument オブジェクトを検索する

QSyntaxHighlighter オブジェクトは、QTextDocument オブジェクトの子ウィジェットであるため、findChild() メソッドを使用して QTextDocument オブジェクトを検索することができます。

QSyntaxHighlighter highlighter;
QTextDocument *document = highlighter.findChild<QTextDocument>();

この方法の利点は、QSyntaxHighlighter オブジェクトと QTextDocument オブジェクトが直接関連付けられていない場合でも、QTextDocument オブジェクトを取得できることです。

注意事項

  • QSyntaxHighlighter::document() メソッドを使用する方が、より安全で効率的な場合もあります。
  • 上記の代替方法は、常に QTextDocument オブジェクトを取得できるとは限りません。

QSyntaxHighlighter::document() メソッド以外にも、QTextDocument オブジェクトを取得する方法があります。状況に応じて適切な方法を選択してください。

  • QTextDocument オブジェクトにアクセスする際は、そのオブジェクトが有効であることを確認する必要があります。
  • QSyntaxHighlighter オブジェクトが関連付けられている QTextDocument オブジェクトが変更された場合は、QSyntaxHighlighter::documentAboutToBeChanged() 信号と QSyntaxHighlighter::documentChanged() 信号を接続して、通知を受けることができます。