2

ユーザーが入力したテキストを保持する QPlainTextEdit ウィジェットがあります。テキストに \n 文字が含まれている場合や、すべてが 1 つの非常に長い行にある場合があります。私の目的は、このテキストをプリンターで (紙に) ワードラップで印刷することです。関数 QPlainTextEdit::print() および QTextDocument::print() は、どちらもページの下部にページ番号を印刷するため、私には適していません。どのページを印刷するかを制御できます (たとえば、ユーザーが 5 ページのうち 2 ページ目だけを印刷したい場合) - ドキュメント全体が常に印刷されます。

基本的に、QPainter オブジェクトを使用してプリンターにテキストを描画しています。私が直面している主な問題は、いつ QPrinter::newPage() 関数を呼び出すかを決定することです。ページに収まるテキストの量をどのように決定しますか? テキストが 1 つの長い行にあり、行が折り返されている場合、最初のページがいっぱいになったときと、2 ページ目を開始するときをどのように知るのでしょうか? 次のコードを使用して描画します。

painter.drawText(printer->pageRect(), Qt::TextWordWrap, ui->plainTextEdit->toPlainText());

Painter は QPainter 型です。printer のタイプは QPrinter です。plainTextEdit は QPlainTextEdit 型です。

4

1 に答える 1

0

テキストの垂直サイズを取得するには、 を呼び出しますpainter.boundingRect( painter.window(), myText ).height();。それが を超えるpainter.window.height()と、 を呼び出す時が来newPage()ました。

これで、boundingRect の高さがページの高さを超えるまで、テキストを単語ごとに作成するだけです。ページに収まることがわかっている「安全な」QString と、新しい単語を追加したばかりの「安全でない」QString を保持することをお勧めします。新しい単語が高さを超えていない場合は、安全な文字列を安全でない文字列に割り当てます。(Qt には共有コピーのようないくつかの最適化があり、計算負荷が高くなりすぎないようにしています)。

QString 内の個々の単語を処理するには、スペース、タブ、改行などの空白を検索できるように、それらの QRegExp バリアントを操作するindexOf()か使用する必要があります。split()

ページに収まらない単一の「単語」を考慮して、単語の途中で分割する必要があります。詳細には他の悪魔がいるかもしれませんが、うまくいけば、それが良いスタートを切ることができます.

于 2013-10-28T00:12:51.707 に答える