Qt使用Qpainter绘制并调用QPrinter打印

在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”文件夹)拷贝到你程序同目录。
这样,程序绘制并打印输出就没问题了!!

  • 9
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值