【初心者向け】Qt Widgets プログラミング:QPlainTextDocumentLayout::documentSize() 関数の使い方


QPlainTextDocumentLayout::documentSize() 関数は、QPlainTextDocument オブジェクトに含まれるテキストコンテンツ全体のサイズをピクセル単位で返します。このサイズは、ドキュメント内のすべての行と段落を考慮したものであり、ウィンドウに表示されたり、印刷されたりする際に必要な領域を決定するために使用されます。

構文

QSizeF QPlainTextDocumentLayout::documentSize() const;

戻り値

QSizeF オブジェクト。このオブジェクトは、widthheight という 2 つのプロパティを持ちます。width はドキュメントの幅、height はドキュメントの高さをピクセル単位で表します。

QPlainTextDocument document;
QPlainTextDocumentLayout layout(&document);

QSizeF documentSize = layout.documentSize();
int width = documentSize.width();
int height = documentSize.height();

qDebug() << "Document width:" << width;
qDebug() << "Document height:" << height;

詳細

QPlainTextDocumentLayout::documentSize() 関数は、ドキュメント内のすべての行と段落を反復処理し、それぞれのサイズを計算することで、最終的なドキュメントサイズを算出します。行のサイズは、フォントサイズ、行幅、および行末文字の幅を考慮して計算されます。段落のサイズは、段落内のすべての行のサイズと、段落間の余白を考慮して計算されます。

ドキュメントのサイズが変更された場合は、QPlainTextDocumentLayout::documentSizeChanged() シグナルが emit されます。このシグナルは、ドキュメントのレイアウトを更新する必要があることを示します。

  • QPlainTextDocumentLayout::documentSize() 関数は、読み取り専用の関数です。ドキュメントのサイズを変更するには、QTextDocument::setPageSize() 関数を使用する必要があります。
  • ドキュメントのサイズが変更された場合は、QPlainTextDocumentLayout::documentSizeChanged() シグナルを処理して、レイアウトを更新する必要があります。
  • QTextLine::boundingRect()
  • QTextBlock::boundingRect()
  • QPlainTextDocumentLayout::documentSizeChanged()
  • QTextDocument::setPageSize()


#include <QApplication>
#include <QPlainTextDocument>
#include <QPlainTextDocumentLayout>

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

  // ドキュメントを作成
  QPlainTextDocument document;
  document.setPlainText("This is a sample text document.\n"
                        "This is the second line of the document.\n"
                        "This is the third line of the document.\n");

  // ドキュメントレイアウトを作成
  QPlainTextDocumentLayout layout(&document);

  // ドキュメントのサイズを取得
  QSizeF documentSize = layout.documentSize();
  int width = documentSize.width();
  int height = documentSize.height();

  // ドキュメントのサイズを出力
  qDebug() << "Document width:" << width;
  qDebug() << "Document height:" << height;

  return 0;
}

このコードを実行すると、次の出力がコンソールに表示されます。

Document width: 315
Document height: 150

この出力は、ドキュメント内のテキストコンテンツ全体の幅が 315 ピクセル、高さが 150 ピクセルであることを示しています。

  1. 最初に、QApplication オブジェクトを作成して Qt アプリケーションを初期化します。
  2. 次に、QPlainTextDocument オブジェクトを作成して、ドキュメントのテキストコンテンツを設定します。
  3. 次に、QPlainTextDocumentLayout オブジェクトを作成して、ドキュメントレイアウトを作成します。
  4. 次に、QPlainTextDocumentLayout::documentSize() 関数を使用して、ドキュメントのサイズを取得します。
  5. 最後に、ドキュメントの幅と高さをコンソールに出力します。


代替方法

  1. QTextBlock::boundingRect() 関数を使用する

この関数は、個々のテキストブロックの境界矩形をピクセル単位で返します。ドキュメント内のすべてのテキストブロックの境界矩形を反復処理して、それらを組み合わせてドキュメント全体のサイズを計算することができます。

  1. QTextLine::boundingRect() 関数を使用する
  1. QTextCursor::pos() と QTextCursor::atEnd() 関数を使用する

この方法は、ドキュメント内のすべてのテキスト文字を反復処理し、それぞれの位置を記録することで、ドキュメント全体のサイズを計算します。

どの方法を選択するべきか

どの代替方法を選択するかは、状況によって異なります。

  • ドキュメント全体のサイズを迅速かつ簡単に取得したい場合は、QPlainTextDocumentLayout::documentSize() 関数を使用します。
  • ドキュメント内のすべてのテキスト文字を反復処理する必要がある場合は、QTextCursor::pos() 関数と QTextCursor::atEnd() 関数を使用します。
  • 個々のテキストブロックやテキスト行のサイズを取得したい場合は、QTextBlock::boundingRect() 関数または QTextLine::boundingRect() 関数を使用します。

QTextBlock::boundingRect() 関数を使用する場合

QPlainTextDocument document;
QPlainTextDocumentLayout layout(&document);

QTextBlock block = layout.document().firstBlock();

while (!block.isNull()) {
  QRectF blockRect = block.boundingRect();
  qDebug() << "Block width:" << blockRect.width();
  qDebug() << "Block height:" << blockRect.height();

  block = block.next();
}

QTextLine::boundingRect() 関数を使用する場合

QPlainTextDocument document;
QPlainTextDocumentLayout layout(&document);

QTextBlock block = layout.document().firstBlock();

while (!block.isNull()) {
  QTextLine line = block.firstLine();

  while (!line.isNull()) {
    QRectF lineRect = line.boundingRect();
    qDebug() << "Line width:" << lineRect.width();
    qDebug() << "Line height:" << lineRect.height();

    line = line.next();
  }

  block = block.next();
}

QTextCursor::pos() と QTextCursor::atEnd() 関数を使用する場合

QPlainTextDocument document;
QPlainTextDocumentLayout layout(&document);

QTextCursor cursor(&document);

while (!cursor.atEnd()) {
  QPointF cursorPos = cursor.position();
  int x = cursorPos.x();
  int y = cursorPos.y();

  // ドキュメント全体のサイズを更新

  cursor.movePosition(QTextCursor::NextCharacter);
}
  • ドキュメントのサイズが変更された場合は、レイアウトを更新する必要があります。