【问题标题】:Print plain text to printer (paper)将纯文本打印到打印机(纸张)
【发布时间】:2013-08-21 22:22:47
【问题描述】:

我有一个 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 类型。

【问题讨论】:

  • 您可能需要 QFontMetrics 来获取文本大小。

标签: qt


【解决方案1】:

要获取文本的垂直大小,请致电painter.boundingRect( painter.window(), myText ).height();。当超过painter.window.height() 时,就该致电newPage()

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多