Qt GUIプログラミングの奥義を解き明かす!QTextDocument::pageSizeで実現する洗練されたページレイアウト


QTextDocument::pageSize は、Qt GUI における QTextDocument クラスのメンバー関数であり、ドキュメントのページサイズを設定または取得するために使用されます。ページサイズは、ドキュメントの幅と高さをポイント単位で指定します。

用途

QTextDocument::pageSize は、以下の用途で使用されます。

  • ページ分割
    長いドキュメントを複数のページに分割することができます。
  • ドキュメントビューのサイズ調整
    ページサイズに基づいて、ドキュメントビューのサイズを自動的に調整することができます。
  • 印刷時のページレイアウト制御
    ドキュメントのページサイズを設定することで、印刷時のレイアウトを制御することができます。

使用方法

QTextDocument::pageSize の使用方法は以下の通りです。

// ページサイズを取得する
QSizeF pageSize = document.pageSize();

// ページサイズを設定する
document.setPageSize(QSizeF(210, 297)); // A4 サイズ

注意点

  • ページサイズは、プリンタの設定によって異なる場合があります。印刷前に、プリンタの設定を確認することをお勧めします。
  • ページサイズは、ドキュメントのコンテンツとは独立しています。コンテンツがページサイズからはみ出してしまう場合は、レイアウトが崩れる可能性があります。

以下の例では、QTextDocument クラスを使用して、A4 サイズのドキュメントを作成し、それを PDF ファイルに出力します。

#include <QCoreApplication>
#include <QTextDocument>
#include <QPdfWriter>

int main(int argc, char *argv[]) {
  QCoreApplication app(argc, argv);

  // ドキュメントを作成
  QTextDocument document;

  // ページサイズを設定
  document.setPageSize(QSizeF(210, 297)); // A4 サイズ

  // ドキュメントにテキストを追加
  QTextCursor cursor(&document);
  cursor.insertText("This is an example text document.");

  // PDF ファイルに出力
  QPdfWriter pdfWriter("example.pdf");
  pdfWriter.setPageSize(document.pageSize());
  QPainter painter(&pdfWriter);
  document.print(&painter);

  return 0;
}


例1:A4サイズのドキュメントを作成し、PDFファイルに出力する

#include <QCoreApplication>
#include <QTextDocument>
#include <QPdfWriter>

int main(int argc, char *argv[]) {
  QCoreApplication app(argc, argv);

  // ドキュメントを作成
  QTextDocument document;

  // ページサイズを設定
  document.setPageSize(QSizeF(210, 297)); // A4 サイズ

  // ドキュメントにテキストを追加
  QTextCursor cursor(&document);
  cursor.insertText("This is an example text document.");

  // PDF ファイルに出力
  QPdfWriter pdfWriter("example.pdf");
  pdfWriter.setPageSize(document.pageSize());
  QPainter painter(&pdfWriter);
  document.print(&painter);

  return 0;
}

例2:ページサイズを取得し、コンソールに出力する

この例では、QTextDocument::pageSizeを使用して、ドキュメントのページサイズを取得し、コンソールに出力します。

#include <QCoreApplication>
#include <QTextDocument>

int main(int argc, char *argv[]) {
  QCoreApplication app(argc, argv);

  // ドキュメントを作成
  QTextDocument document;

  // ページサイズを取得
  QSizeF pageSize = document.pageSize();

  // コンソールに出力
  qDebug() << "Page size:" << pageSize;

  return 0;
}

例3:ページサイズを設定し、ドキュメントビューのサイズを自動調整する

この例では、QTextDocument::pageSizeを使用して、ページサイズを設定し、ドキュメントビューのサイズを自動調整します。

#include <QApplication>
#include <QTextDocument>
#include <QTextEdit>

int main(int argc, char *argv[]) {
  QApplication app(argc, argv);

  // ドキュメントを作成
  QTextDocument document;

  // ページサイズを設定
  document.setPageSize(QSizeF(210, 297)); // A4 サイズ

  // ドキュメントにテキストを追加
  QTextCursor cursor(&document);
  cursor.insertText("This is an example text document.");

  // テキストエディタを作成
  QTextEdit textEdit;
  textEdit.setDocument(&document);

  // ドキュメントビューのサイズを自動調整
  textEdit.adjustSize();

  // テキストエディタを表示
  textEdit.show();

  return app.exec();
}


代替方法

以下に、QTextDocument::pageSize の代替方法をいくつか紹介します。

QTextFrame::size() を使用する

QTextFrame クラスは、QTextDocument 内のフレームを表すクラスです。QTextFrame::size() メソッドを使用して、フレームのサイズを取得できます。フレームのサイズは、ページサイズと一致する場合があります。

// フレームを取得
QTextFrame *frame = document.rootFrame();

// フレームのサイズを取得
QSizeF size = frame->size();

// ページサイズと一致するかどうかを確認
if (size == document.pageSize()) {
  // フレームのサイズがページサイズと同じ場合
} else {
  // フレームのサイズがページサイズと異なる場合
}

QPrinter::pageSize() を使用する

QPrinter クラスは、印刷ジョブを管理するためのクラスです。QPrinter::pageSize() メソッドを使用して、プリンタのページサイズを取得できます。プリンタのページサイズは、ドキュメントのページサイズとは異なる場合があります。

// プリンタを取得
QPrinter printer;

// プリンタのページサイズを取得
QSizeF pageSize = printer.pageSize();

// ドキュメントのページサイズを設定
document.setPageSize(pageSize);

カスタムレイアウトを使用する

QTextDocument のデフォルトレイアウトは、ページベースのレイアウトです。しかし、カスタムレイアウトを使用することで、ページサイズを制御することができます。

// カスタムレイアウトを作成
QTextLayout *layout = new QTextLayout();

// レイアウトにテキストを追加
layout->setText(document.text());

// レイアウトのサイズを設定
layout->boundingRect().size();

ページ分割アルゴリズムを使用する

長いドキュメントを複数のページに分割するには、ページ分割アルゴリズムを使用することができます。

// ページ分割アルゴリズムを作成
QTextPageBreakAlgorithm algorithm;

// ページ分割を実行
algorithm.begin(document);

// 各ページのサイズを取得
while (algorithm.hasNext()) {
  QTextPage *page = algorithm.nextPage();
  QSizeF pageSize = page->pageSize();

  // ...
}

注意事項

上記に示した代替方法は、それぞれ異なる用途に適しています。状況に応じて適切な方法を選択してください。

  • QTextDocument::pageSize は、Qt GUI の古いバージョンでは非推奨となっている場合があります。新しいバージョンでは、上記の代替方法を使用することをお勧めします。