2013-08-21 124 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()一起玩,以便您可以搜索空格,制表符,换行符等空格。

你必须考虑一个单词“单词”,它本身不适合在一个页面上,并将其分割成中间字。细节中可能还有其他的恶魔,但希望能让你有一个好的开始。