Qt Print Support:常见用法解释

本文详细介绍了Qt框架中关于打印和预览的相关功能,包括QPrinter、QPrintDialog、QPageSetupDialog、QPrintPreviewDialog和QPrintPreviewWidget的使用方法,以及如何实现页面设置、预览和实际打印操作。通过示例代码展示了如何利用QPainter进行多页绘制,并且提到了QPDFWriter在生成PDF文件中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Qt Print Support

Qt为打印功能提供了广泛的跨平台支持。使用每个平台上的打印系统,Qt应用程序可以打印到连接的打印机上,也可以通过网络打印到远程打印机上。QT的打印系统还支持PDF文件生成,为基本报表生成设施提供基础。

1、相关的类

image-20210525115633680

所有类中代表可打印机设备的就是 QPrinter ,其他所有的控件都是对打印机进行设置(比如:选择打印机、纸张大小、纸张来源等),以及提供打印机信息的帮助类。

QPDFWriter 是另外一个可分页的绘制设备,与这个打印机体系不匹配。

QPrinter 继承了 QPagedPaintDevice 表示 支持多页/分页打印,本身也是可绘制设备,所以很容易就想到QPainter来直接绘制,分页使用 QPrinter::newPage() 函数。

2、打印机设置功能 QPrintDialog

2.1) 构造一个QPrinter

2.2)为 QPrinter 安装配置对话框 QPrintDialog

2.3)设置打印机选项

2.4)使用 QPainter 绘制一个 3 页的文件

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QPrinter printer;       // 定义一个打印机

    QPrintDialog dialog(&printer);  // 打印机的配置对话框

    int ret = dialog.exec ();       // 执行配置对话框

    if(ret == QDialog::Rejected )   // 拒绝就返回
        return 0;

    QPainter painter(&printer);     // 加上画家

    for (int i = 0; i < 3; ++i) {
        painter.fillRect (0,0,100,100,Qt::red);
        if(i < 2)       // 最后不需要空白页
            printer.newPage();      // 添加新页
    }

    painter.end ();     // 结束绘制

    return 0;
}

在这里插入图片描述

打印结果:

在这里插入图片描述

3、打印页面设置对话框 QPageSetupDialog

在上面的代码 加入设置打印页面功能,页面设置也可以设置横排和竖排。

3.1)定义页面设置对话框 QPageSetupDialog(QPrinter)

3.2)执行页面设置对话框,边距设置20mm
在这里插入图片描述

在这里插入图片描述

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QPrinter printer;       // 定义一个打印机

    QPrintDialog dialog(&printer);  // 打印机的配置对话框

    int ret = dialog.exec ();       // 执行配置对话框

    if(ret == QDialog::Rejected )   // 拒绝就返回
        return 0;


    QPageSetupDialog pageDialog(&printer);      // 打印机的页面设置对话框
    ret = pageDialog.exec ();
    if(ret == QDialog::Rejected )   // 拒绝就返回
        return 0;

    QPainter painter(&printer);     // 加上画家

    for (int i = 0; i < 3; ++i) {
        painter.fillRect (0,0,100,100,Qt::red);
        if(i < 2)       // 最后不需要空白页
            printer.newPage();      // 添加新页
    }

    painter.end ();     // 结束绘制

    return 0;
}

4、打印预览与配置的对话框 QPrintPreviewDialog

当需要生成一组预览页时,可以使用打印预览与配置的对话框 QPrintPreviewDialog。

该预览对话框 将自动发出 paintRequested(QPrinter *printer) 信号。连接这个信号到绘制函数。使用与实际打印完全相同的代码,包括QPrinter::newPage() 启动新页面函数。

3.1)为打印机安装 打印预览与配置对话框 QPrintPreviewDialog

3.2)连接 paintRequested(QPrinter *printer)

3.3)QPrintPreviewDialog 执行。

为了方便调用,把绘制函数的代码 模块化成一个绘制函数 ,比如:void paintFun(QPrinter *printer)。

完整代码如下:

#include "MainWindow.h"
#include <QtWidgets>
#include <QtPrintSupport>

void paintFun(QPrinter *printer){
    QPainter painter(printer);     // 加上画家

    for (int i = 0; i < 3; ++i) {
        painter.fillRect (0,0,100,100,Qt::red);
        if(i < 2)       // 最后不需要空白页
            printer->newPage();      // 添加新页
    }

    painter.end ();     // 结束绘制
}


int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QPrinter printer;       // 定义一个打印机

    QPrintDialog dialog(&printer);  // 打印机的配置对话框

    int ret = dialog.exec ();       // 执行配置对话框

    if(ret == QDialog::Rejected )   // 拒绝就返回
        return 0;


    QPageSetupDialog pageDialog(&printer);      // 打印机的页面设置对话框
    ret = pageDialog.exec ();
    if(ret == QDialog::Rejected )   // 拒绝就返回
        return 0;


    QPrintPreviewDialog preDialog(&printer);    // 打印预览与设置对话框
    QObject::connect (&preDialog,&QPrintPreviewDialog::paintRequested, paintFun);// 连接信号槽
    ret = preDialog.exec ();        // 执行,此时就能看到预览页面了,也可以设置相关的打印机配置
    if(ret == QDialog::Rejected )   // 拒绝就返回
        return 0;

    paintFun (&printer);            // 调用绘制函数进行实际的绘制


    return 0;
}

在这里插入图片描述

5、预览打印机输出的页面布局 QPrintPreviewWidget

QPrintPreviewWidget类用于预览打印机输出的页面布局。外观如下,只有一个显示页面,没有其他的操作按钮,可以提供略缩图功能。也有一个 paintRequested(QPrinter *printer) 信号,用法和预览对话框一样。

image-20210525132341549

6、打印机的信息类 QPrinterInfo

这个和QPrinter的关系 如果 QFileInfo 和 QFile 的关系。具体用法可以参考官档,无须深究。

7、QPrintEngine 类

QPrintEngine类定义了QPrinter如何与给定打印子系统交互的接口。多用于创建自己的打印引擎,可以略过。

8、QPdfWriter 类

QPDFWriter 是另外一个可分页的绘制设备,不属于printsupport模块,另外分析。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值