我有一个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 :(得分:0)
要获取文字的垂直尺寸,请致电painter.boundingRect( painter.window(), myText ).height();
。如果超过painter.window.height()
,则需要致电newPage()
。
现在只需要逐字逐句地构建文本,直到boundingRect高度超过页面高度。我建议保留一个你知道适合页面的“安全”QString和你刚刚添加新单词的“不安全”QString。如果新单词没有超过高度,则将安全字符串分配给不安全的字符串。 (Qt有一些优化,比如共享复制,以防止计算过于密集)。
要处理QString中的单个单词,您需要使用其QRegExp变体使用indexOf()
或split()
,以便搜索空格,制表符,换行符等空格。
你必须考虑一个单独的“单词”,它本身不适合页面,并在单词中分开。细节中可能还有其他恶魔,但希望这会给你一个良好的开端。