Qt Print Support
Qt Print Support 模块为打印提供了广泛的跨平台支持。通过使用各平台上的打印系统,Qt 应用程序可以打印到连接的打印机,也可以跨网络打印到远程打印机。打印系统还支持 PDF 文件生成,为基本报告生成功能奠定了基础。
Qt Print Support 不适用
- Android™
- iOS
支持打印的类
以下类支持选择和设置打印机以及打印输出。
用于配置打印机的打印对话框的基本实现 | |
代表页面范围集合 | |
打印机页面相关选项的配置对话框 | |
指定打印机配置的对话框 | |
定义 QPrinter 与特定打印子系统交互的接口 | |
预览和配置打印机输出页面布局的对话框 | |
预览打印机输出页面布局的小工具 | |
在打印机上绘画的绘画设备 | |
提供访问现有打印机信息的途径 |
喷绘设备和打印
打印机由QPrinter 表示,它是一种可提供特定打印功能(如支持多页和双面输出)的喷绘设备。因此,打印涉及使用QPainter 在一系列页面上绘画,就像在自定义部件或图像上绘画一样。
创建 QPrinter
虽然QPrinter 对象的构建和设置无需用户输入,但打印通常是根据用户请求执行的;例如,当用户在图形用户界面应用程序中选择File|Print... 菜单项时。在这种情况下,一个新构建的QPrinter 对象会提供给QPrintDialog ,允许用户指定要使用的打印机、纸张大小和其他打印属性。
QPrinter printer; QPrintDialog dialog(&printer, this); dialog.setWindowTitle(tr("Print Document")); if (editor->textCursor().hasSelection()) dialog.addEnabledOption(QAbstractPrintDialog::PrintSelection); if (dialog.exec() != QDialog::Accepted) return;
在向打印对话框提供QPrinter 之前,还可以通过修改 来设置某些默认属性。例如,生成成批打印报告的应用程序可以将QPrinter 默认设置为write to a local file ,而不是打印机。
绘制到页面上
一旦构建并设置了QPrinter 对象,就可以使用QPainter 对其执行绘制操作。我们可以按以下方式构建和设置绘制器:
QPrinter printer(QPrinter::HighResolution); printer.setOutputFileName("print.ps"); QPainter painter; painter.begin(&printer); for (int page = 0; page < numberOfPages; ++page) { // Use the painter to draw on the page. if (page != lastPage) printer.newPage(); } painter.end();
由于QPrinter 一开始是空白页,因此我们只需在绘制完每一页(最后一页除外)后调用newPage() 函数即可。
当我们调用end() 时,文档将被发送到打印机或写入本地文件。
坐标系统
QPrinter 提供的函数可用于获取纸张(纸张矩形)和可打印区域(页面矩形)的尺寸信息。这些信息以逻辑设备坐标形式给出,可能与设备本身使用的物理坐标不同,这表明打印机能够以比用户显示器(通常更高)的分辨率渲染文本和图形。
虽然我们不需要自己处理逻辑坐标和物理坐标之间的转换,但我们仍然需要对绘画操作进行转换,因为用于在屏幕上绘画的像素测量值通常太小,无法达到典型打印机的较高分辨率。
打印机和绘图仪坐标系 paperRect() 和pageRect() 函数提供了打印用纸的尺寸和可在其上绘画的区域的信息。 pageRect() 返回的矩形通常位于paperRect() 返回的矩形内。在使用QPainter 和QPrinter 作为底层涂画设备时,无需考虑这些区域的位置和大小;涂画器坐标系的原点将与页面矩形的左上角重合,涂画操作将被剪切到页面可绘制部分的边界。 | ![]() |
在绘制文本时,绘制系统会自动使用正确的设备度量,但如果需要使用从字体度量中获取的信息来定位文本,则需要确保在构建QFontMetrics 和QFontMetricsF 对象时指定打印设备,或确保所使用的每个QFont 都是使用接受QPaintDevice 参数的构造函数形式构建的。
打印部件
要打印部件,可以使用QWidget::render() 函数。如前所述,打印机的分辨率通常高于屏幕分辨率,因此您必须缩放绘制者。您可能还想在页面上定位部件。下面的代码示例展示了如何定位。
QPainter painter; painter.begin(&printer); const auto pageLayout = printer.pageLayout(); const auto pageRect = pageLayout.paintRectPixels(printer.resolution()); const auto paperRect = pageLayout.fullRectPixels(printer.resolution()); double xscale = pageRect.width() / double(myWidget->width()); double yscale = pageRect.height() / double(myWidget->height()); double scale = qMin(xscale, yscale); painter.translate(pageRect.x() + paperRect.width() / 2., pageRect.y() + paperRect.height() / 2.); painter.scale(scale, scale); painter.translate(-myWidget->width() / 2., -myWidget->height() / 2.); myWidget->render(&painter);
这将使 Widget 在页面上居中,并缩放使其适合页面。
从复杂部件打印
某些 Widget(如QTextEdit 和QGraphicsView )显示丰富的内容,这些内容通常由其他类(如QTextDocument 和QGraphicsScene )的实例管理。因此,通常是这些内容处理类提供打印功能,要么是通过一个可用于执行完整任务的函数,要么是通过一个接受现有QPainter 对象的函数。有些部件提供了方便的函数来暴露底层打印功能,从而避免了为了调用一个函数而获取内容处理程序的需要。
下表列出了不同部件中负责打印的类和函数。对于不直接公开打印功能的 widget,可通过相应 widget API 中的函数获取包含该功能的内容处理类。
部件 | 打印功能 | 接受 |
---|---|---|
QGraphicsView | QGraphicsView::render() | QPainter |
QSvgWidget | QSvgRenderer::render() | QPainter |
QTextEdit | QTextDocument::print() | QPrinter |
QTextLayout | QTextLayout::draw() | QPainter |
QTextLine | QTextLine::draw() | QPainter |
QTextEdit 需要 而不是 ,因为它使用配置的页面尺寸信息,以便在打印文档中最合适的位置插入分页符。QPrinter QPainter
使用模块
使用 Qt 模块需要直接或通过其他依赖项链接模块库。有几种构建工具为此提供了专门支持,包括CMake和qmake。
使用 CMake 构建
使用find_package()
命令在Qt6
软件包中找到所需的模块组件:
find_package(Qt6 REQUIRED COMPONENTS PrintSupport) target_link_libraries(mytarget PRIVATE Qt6::PrintSupport)
另请参阅使用 CMake 构建概述。
使用 qmake 构建
要配置使用 qmake 构建的模块,请在项目的 .pro 文件中添加模块作为QT
变量的值:
QT += printsupport
模块演变
对Qt Print Support 的更改列出了模块 API 和功能中为 Qt 6 系列 Qt 所做的重要更改。
许可证和商标
Qt Print Support 模块可在Qt Company 的商业许可下使用。此外,它还受自由软件许可证的保护:GNU 宽通用公共许可证第 3 版或GNU 通用公共许可证第 2 版。更多详情,请参阅Qt 许可。
请注意,Adobe®对在 PDF 中使用其商标(包括徽标)有限制,例如 "Adobe PDF"。有关指南请参阅www.adobe.com。
© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.