Qt为打印功能提供了广泛的跨平台支持。使用每个平台上的打印系统,Qt应用程序可以打印到连接的打印机上,也可以通过网络打印到远程打印机上。QT的打印系统还支持PDF文件生成,为基本报表生成设施提供基础。
所有类中代表可打印机设备的就是 QPrinter ,其他所有的控件都是对打印机进行设置(比如:选择打印机、纸张大小、纸张来源等),以及提供打印机信息的帮助类。
QPDFWriter 是另外一个可分页的绘制设备,与这个打印机体系不匹配。
QPrinter 继承了 QPagedPaintDevice 表示 支持多页/分页打印,本身也是可绘制设备,所以很容易就想到QPainter来直接绘制,分页使用 QPrinter::newPage() 函数。
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.1)定义页面设置对话框 QPageSetupDialog(QPrinter)
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;
}
当需要生成一组预览页时,可以使用打印预览与配置的对话框 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
#include
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;
}
QPrintPreviewWidget类用于预览打印机输出的页面布局。外观如下,只有一个显示页面,没有其他的操作按钮,可以提供略缩图功能。也有一个 paintRequested(QPrinter *printer) 信号,用法和预览对话框一样。
这个和QPrinter的关系 如果 QFileInfo 和 QFile 的关系。具体用法可以参考官档,无须深究。
QPrintEngine类定义了QPrinter如何与给定打印子系统交互的接口。多用于创建自己的打印引擎,可以略过。
QPDFWriter 是另外一个可分页的绘制设备,不属于printsupport模块,另外分析。