本页内容

Qt Print Support

Qt Print Support 模块为打印功能提供了广泛的跨平台支持。通过利用各平台的打印系统,Qt应用程序既可以打印到已连接的打印机,也可以通过网络打印到远程打印机。该打印系统还支持生成PDF文件,为基本的报表生成功能奠定了基础。

Qt Print Support 以下平台不支持:

  • Android™
  • iOS

支持打印的类

以下类支持打印机的选择、配置以及打印输出。

QAbstractPrintDialog

用于配置打印机的打印对话框的基础实现

QPageRanges

表示一组页面范围

QPageSetupDialog

用于配置打印机页面相关选项的配置对话框

QPrintDialog

用于指定打印机配置的对话框

QPrintEngine

定义了 QPrinter 与给定打印子系统交互方式的接口

QPrintPreviewDialog

用于预览和配置打印机输出页面布局的对话框

QPrintPreviewWidget

用于预览打印机输出页面布局的控件

QPrinter

在打印机上绘制的绘图设备

QPrinterInfo

提供访问现有打印机信息的途径

绘图设备与打印

打印机由QPrinter 表示,这是一种绘图设备,提供打印特有的功能,例如对多页和双面输出的支持。因此,打印过程涉及使用QPainter 在一系列页面上进行绘制,其操作方式与在自定义控件或图像上绘制完全相同。

创建 QPrinter

尽管QPrinter 对象可以在无需用户输入的情况下进行构造和配置,但打印通常是应用户请求而执行的;例如,当用户在GUI应用程序中选择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 作为底层绘图设备一起使用时,无需考虑这些区域的位置和大小;绘图者的坐标系原点将与页面矩形的左上角重合,且绘制操作将被裁剪至页面可绘制部分的边界内。

关于 paperRect() 和 pageRect() 的 with 和 height 如何确定的示意图

绘图系统在绘制文本时会自动使用正确的设备度量值,但如果您需要根据字体度量信息定位文本,则必须确保在构建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);

这将把小部件居中显示在页面上,并对其进行缩放以适应页面。

从复杂小部件打印

某些控件(例如QTextEdit 和QGraphicsView )会显示丰富的内容,这些内容通常由其他类的实例(如QTextDocument 和QGraphicsScene )进行管理。因此,通常是由这些内容处理类来提供打印功能,具体方式包括:提供一个可执行完整任务的函数,或者提供一个接受现有QPainter 对象的函数。 某些小部件提供了便捷函数来调用底层的打印功能,从而避免了仅为调用单个函数而获取内容处理程序的麻烦。

下表列出了负责从各种小部件中进行打印的类和函数。对于未直接暴露打印功能的小部件,可通过相应小部件 API 中的函数获取包含此功能的内容处理类。

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列出了为 Qt 6 系列所做的模块 API 和功能方面的重大变更。

许可与商标

Qt Print Support 模块由The Qt Company 提供商业许可。此外,它还提供自由软件许可:GNU 较少通用公共许可证第 3 版或GNU 通用公共许可证第 2 版。更多详情请参阅Qt 许可。

请注意,Adobe®对与其 PDF 相关商标(包括徽标)的使用(例如“Adobe PDF”)设有限制。相关指南请参阅www.adobe.com。

© 2026 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.