Qt GUIプログラミング:QTextBlockFormat::pageBreakPolicy()で段落の改ページを制御する方法
QTextBlockFormat::pageBreakPolicy()
は、Qt GUIライブラリにおけるテキストフォーマットクラスQTextBlockFormat
のメソッドの一つです。このメソッドは、段落の改ページポリシーを取得します。改ページポリシーは、段落がページの最後に配置されるかどうか、または次のページに強制的に移動されるかどうかを決定します。
使用方法
QTextFormat::PageBreakFlags pageBreakPolicy = textBlockFormat.pageBreakPolicy();
このコードは、textBlockFormat
というQTextBlockFormat
オブジェクトの改ページポリシーを取得し、pageBreakPolicy
という変数に格納します。
改ページポリシーの値
QTextBlockFormat::pageBreakPolicy()
は、以下のいずれかの値を返します。
- PageBreak_NoBreak: 改ページなし。テキストブロックは、ページの終わりに配置されず、次のページに強制的に移動もされません。
- PageBreak_After: 強制改ページ。テキストブロックは、常に前のページの末尾に配置されます。
- PageBreak_Before: 強制改ページ。テキストブロックは、常に次のページの先頭に配置されます。
- PageBreak_Auto: 自動改ページ。テキストブロックは、ページの終わりに自然に配置されます。
例
以下のコードは、段落を次のページの先頭に強制的に移動する例です。
QTextBlockFormat textBlockFormat;
textBlockFormat.setPageBreakPolicy(QTextFormat::PageBreak_Before);
- 改ページポリシーは、段落全体に適用されます。段落内の個々の行に異なる改ページポリシーを設定することはできません。
QTextBlockFormat textBlockFormat;
textBlockFormat.setPageBreakPolicy(QTextFormat::PageBreak_Before);
QTextDocument *document = new QTextDocument();
QTextCursor cursor = document->textCursor();
cursor.insertText("This paragraph will be forced to the next page.");
cursor.setBlockFormat(textBlockFormat);
// ...
QTextEdit *textEdit = new QTextEdit();
textEdit->setDocument(document);
このコードは、以下の操作を実行します。
QTextBlockFormat
オブジェクトを作成します。setPageBreakPolicy()
メソッドを使用して、改ページポリシーをPageBreak_Before
に設定します。QTextDocument
オブジェクトを作成します。textCursor()
メソッドを使用して、ドキュメント内のカーソルを取得します。insertText()
メソッドを使用して、カーソルの位置にテキストを挿入します。setBlockFormat()
メソッドを使用して、カーソルの位置にある段落にフォーマットを設定します。QTextEdit
オブジェクトを作成します。setDocument()
メソッドを使用して、QTextDocument
オブジェクトをQTextEdit
ウィジェットに設定します。
このコードを実行すると、"This paragraph will be forced to the next page."というテキストが次のページの先頭に表示されます。
QTextBlockFormat textBlockFormat;
textBlockFormat.setPageBreakPolicy(QTextFormat::PageBreak_Auto);
QTextDocument *document = new QTextDocument();
QTextCursor cursor = document->textCursor();
cursor.insertText("This paragraph will be automatically paginated.");
cursor.setBlockFormat(textBlockFormat);
// ...
QTextEdit *textEdit = new QTextEdit();
textEdit->setDocument(document);
説明
QTextBlockFormat
オブジェクトを作成します。setPageBreakPolicy()
メソッドを使用して、改ページポリシーをPageBreak_Auto
に設定します。QTextDocument
オブジェクトを作成します。textCursor()
メソッドを使用して、ドキュメント内のカーソルを取得します。insertText()
メソッドを使用して、カーソルの位置にテキストを挿入します。setBlockFormat()
メソッドを使用して、カーソルの位置にある段落にフォーマットを設定します。QTextEdit
オブジェクトを作成します。setDocument()
メソッドを使用して、QTextDocument
オブジェクトをQTextEdit
ウィジェットに設定します。
このコードを実行すると、"This paragraph will be automatically paginated."というテキストが自動的に改ページされます。
QTextBlockFormat textBlockFormat;
textBlockFormat.setPageBreakPolicy(QTextFormat::PageBreak_NoBreak);
QTextDocument *document = new QTextDocument();
QTextCursor cursor = document->textCursor();
cursor.insertText("This paragraph will not be paginated.");
cursor.setBlockFormat(textBlockFormat);
// ...
QTextEdit *textEdit = new QTextEdit();
textEdit->setDocument(document);
QTextBlockFormat
オブジェクトを作成します。setPageBreakPolicy()
メソッドを使用して、改ページポリシーをPageBreak_NoBreak
に設定します。QTextDocument
オブジェクトを作成します。textCursor()
メソッドを使用して、ドキュメント内のカーソルを取得します。insertText()
メソッドを使用して、カーソルの位置にテキストを挿入します。setBlockFormat()
メソッドを使用して、カーソルの位置にある段落にフォーマットを設定します。QTextEdit
オブジェクトを作成します。setDocument()
メソッドを使用して、QTextDocument
オブジェクトをQTextEdit
ウィジェットに設定します。
QTextFrameFormat::setExtraPageBreakBefore() と setExtraPageBreakAfter() を使用する
QTextFrameFormat
クラスには、段落の前にまたは後に余分な改ページを挿入するかどうかを制御するメソッドがあります。これらのメソッドは、段落全体の改ページポリシーを制御するのではなく、特定の段落の前後にのみ改ページを挿入する場合に役立ちます。
QTextFrameFormat frameFormat;
frameFormat.setExtraPageBreakBefore(true); // 段落の前に余分な改ページを挿入
frameFormat.setExtraPageBreakAfter(true); // 段落の後に余分な改ページを挿入
QTextCursor cursor = document->textCursor();
cursor.insertFrame(frameFormat); // フォーマットされたフレームを挿入
cursor.insertText("This paragraph will have extra page breaks.");
QTextCursor::insertBlock() 時に PageBreak フラグを使用する
QTextCursor::insertBlock()
メソッドは、テキストブロックを挿入する際に、PageBreakフラグを指定することができます。このフラグは、段落の後に改ページを挿入するかどうかを制御します。
QTextCursor cursor = document->textCursor();
cursor.insertBlock(QTextBlock(), QTextCursor::EndPage); // 段落の後に改ページを挿入
cursor.insertText("This paragraph will have a page break after it.");
レイアウトエンジンに任せる
手動で改行コードを挿入する
最も単純な方法は、手動で改行コード (\n
) を挿入することです。これは、シンプルなテキストレイアウトの場合にのみ有効です。
QTextTable を使用する
複雑なテーブルレイアウトを作成する場合は、QTextTable
クラスを使用することができます。QTextTable
クラスには、改ページポリシーを設定するためのメソッドがあります。
どの方法を選択するべきか
どの方法を選択するべきかは、状況によって異なります。以下に、いくつかの指針を示します。
- 複雑なテーブルレイアウトを作成する場合は、
QTextTable
を使用します。 - シンプルなテキストレイアウトの場合は、手動で改行コードを挿入します。
- レイアウトエンジンに任せることができる場合は、レイアウトエンジンを使用します。
- 段落の後に改ページを挿入する必要がある場合は、
QTextCursor::insertBlock()
時に PageBreak フラグを使用します。 - 特定の段落の前後にのみ改ページを挿入する必要がある場合は、
QTextFrameFormat::setExtraPageBreakBefore()
とsetExtraPageBreakAfter()
を使用します。 - 段落全体の改ページポリシーを制御する必要がある場合は、
QTextBlockFormat::pageBreakPolicy()
を使用します。