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);

このコードは、以下の操作を実行します。

  1. QTextBlockFormatオブジェクトを作成します。
  2. setPageBreakPolicy()メソッドを使用して、改ページポリシーをPageBreak_Beforeに設定します。
  3. QTextDocumentオブジェクトを作成します。
  4. textCursor()メソッドを使用して、ドキュメント内のカーソルを取得します。
  5. insertText()メソッドを使用して、カーソルの位置にテキストを挿入します。
  6. setBlockFormat()メソッドを使用して、カーソルの位置にある段落にフォーマットを設定します。
  7. QTextEditオブジェクトを作成します。
  8. 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);

説明

  1. QTextBlockFormatオブジェクトを作成します。
  2. setPageBreakPolicy()メソッドを使用して、改ページポリシーをPageBreak_Autoに設定します。
  3. QTextDocumentオブジェクトを作成します。
  4. textCursor()メソッドを使用して、ドキュメント内のカーソルを取得します。
  5. insertText()メソッドを使用して、カーソルの位置にテキストを挿入します。
  6. setBlockFormat()メソッドを使用して、カーソルの位置にある段落にフォーマットを設定します。
  7. QTextEditオブジェクトを作成します。
  8. 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);
  1. QTextBlockFormatオブジェクトを作成します。
  2. setPageBreakPolicy()メソッドを使用して、改ページポリシーをPageBreak_NoBreakに設定します。
  3. QTextDocumentオブジェクトを作成します。
  4. textCursor()メソッドを使用して、ドキュメント内のカーソルを取得します。
  5. insertText()メソッドを使用して、カーソルの位置にテキストを挿入します。
  6. setBlockFormat()メソッドを使用して、カーソルの位置にある段落にフォーマットを設定します。
  7. QTextEditオブジェクトを作成します。
  8. 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()を使用します。