2

我有一个 QPlainTextEdit 小部件,其中包含用户输入的文本。文本可能包含 \n 个字符,也可能都在一个很长的行上。我的目标是在带有自动换行的打印机(纸上)上打印此文本。函数 QPlainTextEdit::print() 和 QTextDocument::print() 不适合我,因为它们都在页面底部打印页码,这是我不想要的,其次,我似乎不能能够控制要打印的页面(例如,如果用户只想打印 5 页中的第 2 页) - 始终打印整个文档。

基本上我使用 QPainter 对象在打印机上绘制文本。我面临的主要困难是确定何时调用 QPrinter::newPage() 函数。您如何确定页面上可以容纳多少文本?如果文本在一个长行上并且该行正在自动换行,那么您如何知道第一页何时已满以及何时开始第二页?我使用以下代码进行绘制:

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

Painter 是 QPainter 类型;打印机是 QPrinter 类型;plainTextEdit 是 QPlainTextEdit 类型。

4

1 回答 1

0

要获取文本的垂直大小,请调用painter.boundingRect( painter.window(), myText ).height();. 当超过painter.window.height()时,是时候打电话了newPage()

现在只需逐字构建文本,直到 boundingRect 高度超过页面高度。我建议保留一个您知道将适合页面的“安全”QString 和一个您刚刚添加新单词的“不安全”QString。如果新词没有超过高度,则将安全字符串分配给不安全字符串。(Qt 有一些优化,比如共享复制,以防止计算过于密集)。

要处理 QString 中的单个单词,您需要使用indexOf()split()使用它们的 QRegExp 变体,以便您可以搜索空格,例如空格、制表符、换行符。

您必须考虑一个本身不适合页面的“单词”,并将其拆分到单词中间。细节中可能还有其他问题,但希望这能让你有个好的开始。

于 2013-10-28T00:12:51.707 回答