概述:
本人在项目中需要打印一些项目文件(以图片的形式)工期两天,首先聊聊实现思路,作为一个技术屌丝的我(再加上之前没弄过这块),第一先找到Qt帮助手册对QPrinter一顿查,查完,又找度娘查看看可不可以用纯C++实现,经过以上折腾给自己的结论是如果使用Qt一天编码一天调试会很轻松的交付任务(此处见证大家平时汇报工期一定要给自己留有余地,万一因为不认真出现bug就麻烦了),但是不一定满足部门大佬的初心,如果使用纯C++实现两天会把自己搞的很痛苦,所以做了一个全面了解后去找技术经理碰下,避免走歪路,经过沟通和项目周期情况最后我们选定使用Qt实现打印功能,等软件升级第二版本使用纯C++实现,接下来把我两天的工作以及遇到的问题都在代码中向大家体现;
代码示例:
.h:
#pragma once
#include <QPrinter>
#include <QPixmap>
#include <QPainter>
#include <QPrintPreviewDialog>
#include <QPrintDialog>
#include <QPageSetupDialog>
class CPrinter : public QObject
{
Q_OBJECT
public:
CPrinter();
~CPrinter();
public://打印窗口
/*
* @brief:打印窗口
*/
void startPrinter(QPixmap &pixmap);
public://打印页面设置
/*
* @brief:页面设置
*/
void startPrinterPage();
public://打印预览
/*
* @brief:开启打印预览
*/
void startPrintPreview(QPixmap &pixmap);
private:
/*
* @brief:设置预览内容
*/
void setPrintPixmap(QPixmap &pixmap);
/*
* @brief:获取打印内容
*/
QPixmap getPrintPixmap();
/*
* @brief:开启打印预览窗口
*/
void PrintPreview();
private slots:
void Slot_Preview(QPrinter* printer);
private:
QPixmap m_Pixmap; //界面控件内像素
QPrinter *m_pPrinter; //打印机
};
.cpp:
#include "CPrinter.h"
CPrinter::CPrinter() :m_pPrinter(NULL)
{
if(m_pPrinter == NULL)
m_pPrinter = new QPrinter;
}
CPrinter::~CPrinter()
{
if (m_pPrinter != nullptr)
delete m_pPrinter;
m_pPrinter = NULL;
}
void CPrinter::startPrinter(QPixmap &pixmap)
{
QPrinter printer(QPrinter::ScreenResolution);
QPrintDialog printDialog(&printer);
if (printDialog.exec() == QDialog::Accepted) {
QPainter painterPixmap;
painterPixmap.begin(&printer);
painterPixmap.drawPixmap(0, 0, pixmap);
painterPixmap.end();
}
}
void CPrinter::startPrinterPage()
{
QPrinter printer;
QPageSetupDialog pageSetUpdlg(&printer);
if (pageSetUpdlg.exec() == QDialog::Accepted)
{
printer.setOrientation(QPrinter::Landscape);
}
else
{
printer.setOrientation(QPrinter::Portrait);
}
}
void CPrinter::startPrintPreview(QPixmap &pixmap)
{
if (pixmap.isNull())
return;
setPrintPixmap(pixmap);
PrintPreview();
}
void CPrinter::setPrintPixmap(QPixmap &pixmap)
{
m_Pixmap = pixmap;
}
QPixmap CPrinter::getPrintPixmap()
{
return m_Pixmap;
}
void CPrinter::PrintPreview()
{
QPrinter printer;
QPrintPreviewDialog previewDialog(&printer);
connect(&previewDialog, SIGNAL(paintRequested(QPrinter*)), this, SLOT(Slot_Preview(QPrinter*)));
previewDialog.exec(); //打印预览对话框显示,paintRequest触发
}
void CPrinter::Slot_Preview(QPrinter* printer)
{
QPainter painterPixmap;
painterPixmap.begin(printer);
//QRect rect = painterPixmap.viewport();
//int x = rect.width() / getPrintPixmap().width();
//int y = rect.height() / getPrintPixmap().height();
//painterPixmap.scale(x, y);
painterPixmap.drawPixmap(0, 0, getPrintPixmap());
painterPixmap.end();
}
调用:
if (str.compare(QString::fromLocal8Bit("打印")) == 0)
{
QPixmap pixmap = QPixmap::grabWidget(Widget, Widget->rect());
m_Printer->startPrinter(pixmap);
}
else if (str.compare(QString::fromLocal8Bit("页面设置")) == 0)
{
m_Printer->startPrinterPage();
else if (str.compare(QString::fromLocal8Bit("打印预览")) == 0)
{
QPixmap pixmap = QPixmap::grabWidget(Widget, Widget->rect());
m_Printer->startPrintPreview(pixmap);
}
运行效果图:
1.打印
2.打印预览
3.页面设置
over:
欢迎大家关注作者在文末评论、点赞、转发以及批评指正!
如果大家有更好的方法或有问题可以在文末评论一起讨论!
共同学习!
共同进步!
文末一句话:
什么是随和?
有人说,随和就是顺从众议,不固执己见;有人说,随和就是不斤斤计较,为人和蔼。
还有人说,随和其实就是傻,就是老好人,就是没有原则。
那么,随和到底是什么?随和不是自卑,不是唯唯诺诺,而是有原则、有标准,用淡定的态度做事。
随和的人,朋友多、人缘好。一天两天的随和不是真随和,长久如一的好性情才是真正的随和。