2013-08-21 238 views
2

我有一個QPlainTextEdit小部件,用於保存用戶輸入的文本。該文本可能包含\ n字符,或者它們可能都在一行很長的行中。我的目標是用文字打印機在打印機上(紙上)打印此文本。函數QPlainTextEdit :: print()和QTextDocument :: print()不適合我,因爲它們都在頁面底部打印頁碼,我不想要,其次,我似乎無法能夠控制打印哪些頁面(例如,如果用戶只想打印5頁中的第2頁) - 整個文檔始終打印。將純文本打印到打印機(紙張)

基本上我使用QPainter對象來繪製打印機上的文本。我面臨的主要困難是確定何時調用QPrinter :: newPage()函數。你如何確定在一個頁面上有多少文字?如果文本位於一條長長的一條線上,並且該行正在進行文字包裝,那麼如何知道第一頁何時已滿並何時開始第二頁?我使用下面的代碼來繪製:

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

畫家是QPainter類型;打印機是QPrinter類型的; plainTextEdit是QPlainTextEdit類型。

+0

你可能需要你QFontMetrics來獲取文本的大小。 – Kunal

回答

0

要獲得文字的垂直尺寸,請致電painter.boundingRect(painter.window(), myText).height();。當超過painter.window.height()時,該撥打newPage()

現在只需要逐字地構建文本,直到boundingRect高度超過頁面高度。我建議保持一個「安全」的QString,你知道它會適合在一個頁面上,還有一個「不安全」的QString,你剛剛添加了新的單詞。如果新單詞未超過高度,則將安全字符串分配給不安全字符串。 (Qt有一些優化,如共享複製,以防止計算密集)。

要處理QString中的單個單詞,您需要使用它們的QRegExp變體與indexOf()split()一起玩,以便您可以搜索空格,製表符,換行符等空格。

你必須考慮一個單詞「單詞」,它本身不適合在一個頁面上,並將其分割成中間字。細節中可能還有其他的惡魔,但希望能讓你有一個好的開始。