-2

現在、QTextEdit を使用して WYSIWYG テキスト エディターに取り組んでいます。新しいファイルが読み込まれるたびに、QTextDocument をリセットして再フォーマットし、ファイル (空白) を読み込んで.setHtml()から、その内容をエディターに渡します。私は、新しく作成された各ファイルが、単一の関数で定義された同じデフォルト スタイルを常に持つことを意図していました。

代わりに、空のファイルに入力された新しいテキストは、私が提供したフォーマットにデフォルト設定されるのではなく、以前にロードされた QTextDocument からフォーマットを受け取ります。シンタックス ハイライトされたコードを 1 つのドキュメントにコピー アンド ペーストしてから、新しいドキュメントを作成して入力すると、最も明白です。HTML 構造に存在しないにもかかわらず、フォント、フォントの色、および背景色はすべて新しいドキュメントに引き継がれます。


これは、ファイルが QTextEdit にロードされる前に現在実行している関数です。

fontDefault = QFont()
fontDefault.setFamily("Yantramanav")
fontDefault.setPointSize(11)
fontDefault.setWeight(QFont.Normal)

# editor is a QTextEdit.
def reset_document(editor, defaultFont=fontDefault):
    newDocument = QTextDocument()
    newDocument.setDocumentMargin(12)
    newDocument.setDefaultFont(defaultFont)

    editor.setDocument(newDocument)
    editor.setCurrentFont(defaultFont)

    # Stored on the QTextEdit yet is reset when replacing the QTextDocument.
    editor.setTabStopWidth(33)

書式を保存するドキュメントが置き換えられると、古い書式が失われると想定していました。これが当てはまらないのはなぜですか? また、既定のスタイルのみが適用されるようにするにはどうすればよいですか?

4

1 に答える 1

0

QTextCursor は、ドキュメント間で以前の charFormat を保持しています。それが指す QTextDocument が置き換えられても、カーソル自体は存続し、新しいドキュメントに割り当てられます。このプロセスでは、カーソルが移動するたびに発生するように、カーソルが現在の位置から charFormat をサンプリングすることは明らかにないため、前のドキュメントの最後の位置から charFormat を引き続き保持します。

このオーバーラップを防ぐには、カーソルを置き換えるか移動するだけです。どちらの操作も、新しいドキュメントから charFormat を取得するカーソルになります。reset_document()次のいずれかを関数に追加します。

# 1. Remove old formatting by replacing the cursor.
newCursor = QTextCursor(newDocument)
editor.setTextCursor(newCursor)
# 2. Remove old formatting by moving the cursor.
oldCursor = editor.textCursor()
oldCursor.movePosition(QTextCursor.Start, QTextCursor.MoveAnchor)
editor.setTextCursor(oldCursor)

于 2020-08-17T19:08:59.407 に答える