在Qt中使用QPainter画家类绘制,并调用QPrinter类打印出来
最近项目中需要自己做一些标贴,并用打印机打印出来。故而使用QPainter画家类进行绘制,在调用QPrinter打印机类启动打印机打印。在此将一些类接口使用记录下来。
注意:QPainter 是画家类,用于绘制文字图形等;QPrinter是打印机类,用于调用打印机打印,两个类名称很像,别搞混了。
1.QPainter类绘制:
QPainter类顾名思义,可以被看成是个画家或者创作者,他可以画出文字,矩形,椭圆,图片等等,那他就要有笔,他要有刷子,所以使用QPainter类绘制前先给他配置要用的画笔QPen和画刷QBrush;
//myPaint()函数使用画家进行绘制
void MyPaint(QPainter* painter)
{
//设置画笔
QPen pen;
pen.setWidth(3); //线宽
pen.setColor(QColor(36,36,36)/*Qt::black*/); //划线颜色
pen.setStyle(Qt::SolidLine);//线的类型,实线、虚线等
pen.setCapStyle(Qt::FlatCap);//线端点样式
pen.setJoinStyle(Qt::BevelJoin);//线的连接点样式
painter->setPen(pen);
//设置画刷
QBrush brush;
brush.setColor(Qt::yellow); //画刷颜色
brush.setStyle(Qt::SolidPattern); //画刷填充样式
painter->setBrush(brush);
//设置字体
QFont font;
font.setFamily("Arial"); // 设置字体名称
font.setPointSize(10); // 设置字体大小
font.setBold(true); // 设置字体为粗体
//font.setItalic(true); // 设置字体为斜体
painter->setFont(font);
QRect rect(10,20, 600, 400); //矩形框,左顶宽高
int nSrcX = rect.x();
int nSrcY = rect.y();
//画矩形
painter->drawRect(rect.x(), rect.y(), rect.width(), rect.height());
//画线
pen.setStyle(Qt::DashLine); //根据线的要求修改画笔
painter->setPen(pen); //重新设置画笔
painter->drawLine(nSrcX, nSrcY, nSrcX + rect.width(), nSrcY);
//画文字
painter->drawText(nSrcX, nSrcY, QString::fromLocal8Bit("绘制文字"));
//画图片,来自资源
painter->drawImage(nSrcX + 50, nSrcY + 50, QImage(":/image/Image/lock.png"));
//画图片,外部读取来的图片
QPixmap pixmap("E:/test/testImg.png");
painter->drawPixmap(nSrcX + 100, nSrcY + 100, pixmap);
}
2.QPrinter调用打印机
使用mypaint()只是绘制在内存中,如何给到打印机进行打印,这就要用到QPrinter类,要用QPrinter类,首先需要在项目文件.pro中加上printsupport模块,同时该模块对应的Qt5PrintSupport.dll文件(在Qt安装目录下可以找到)也要跟你的程序放在同目录。
QT += printsupport
再在代码中添加QPrinter相关的头文件
//打印机配置对话框
#include <QtPrintSupport/QPrintDialog>
//预览对话框
#include <QPrintPreviewDialog>
//打印机信息
#include <QPrinterInfo>
开始初始化打印机
//设置你要指定的打印机,在设备管理器看下要用哪个打印机
QString strPrinterName = "假设我用HP打印机,这是他的名称";
//获取设备管理器中所有打印机
QStringList strlist = QPrinterInfo::availablePrinterNames();
QString strSetPrinter;
//寻找打印机
for(QString strPrint: strlist)
{
if(strPrint.contains(strPrinterName))
{
// 按名称找打印机
strSetPrinter = strPrint;
break;
}
}
//如果找到,就设置为指定打印机
if(!strSetPrinter.isEmpty())
{
//用名称指定打印机
printer.setPrinterName(strSetPrinter);
}
else
{ //没找到,我这里默认打印机
strSetPrinter = printer.printerName(); //这就启用了默认打印机
printer.setPrinterName(strSetPrinter);
}
}
// 纸张尺寸
printer.setPageSize(QPrinter::Custom);
// 标签的大小,以毫米为单位
printer.setPaperSize(QSizeF(150, 100), QPrinter::Millimeter);
// 打印DPI分辨率,每英寸的像素点
printer.setResolution(300);
// 页面方向,Landscape横向,Portrait纵向
printer.setOrientation(QPrinter::Portrait);
// 输出文档名称(如果输出文件就不会发往实体打印机,比如你默认用的windows的PDF,那就会输出pdf文件)
// QString strPdfPath = "MyPrinter.pdf";
// printer.setOutputFileName(strPdfPath);
//设置打印份数
printer.setCopyCount(1);
//
//以上,打印机就设置好了
//
//定义画家
QPainter painter;
// 打印机配给画家
if (!painter.begin(printer))
{
//初始化失败
return;
}
// 设置打印内容的边距
QMarginsF margins(10, 10, 10, 10);
printer->setPageMargins(margins);
// 绘制区域
QRectF rect(margins.left(), margins.top(),
printer->pageRect().width() - margins.left() - margins.right(),
printer->pageRect().height() - margins.top() - margins.bottom());
//调用前面的函数开始绘制
MyPaint(&painter);
//绘制完一页,还想再绘制就newPage新建一页(首页不需要新建,跟word一样,创建新文件后就自带第一页)
printer->newPage();
//再绘制一页
MyPaint(&painter);
// 结束绘画,一结束就会发给打印机开始打印
painter.end();
3.总结
这样你调试运行不会有任何没问题,可以正常的绘图,也能打印出文件。但当你把整个程序发给别人后,虽然他的电脑也已经正常连接了打印机,可你的程序执行打印时,打印机却没反应。
这是因为还缺少printsupport文件夹中的依赖库,在Qt安装目录下的plugins文件夹中,找到printsupport文件夹,发现里边有“windowsprintersupport.dll”和“windowsprintersupportd.dll”(加d的是debug版本的库,对于正式release输出的程序,拷贝时可以不要“windowsprintersupportd.dll”库),将printsupport文件夹(注意是“printsupport”文件夹)拷贝到你程序同目录。
这样,程序绘制并打印输出就没问题了!!