QT之打印 QPrinter
1. 打印设置
QPrinter类是一个在打印机上绘图的设备。该设备表示打印输出的一系列页面,提供了一组附加功能来管理特定于设备的特性,比如方向和分辨率,以及在生成文档时逐步遍历其中的页面。
注:在更改任何参数之前,可以使用QPrinter::isValid()来验证这一点。
(1)打印机设置
1)代码设置
获取打印机设备列表
QStringList strlist = QPrinterInfo::availablePrinterNames();
打印设备
QPrinter Printer;(该文档以下所有Printer都为类QPrinter 定义)
获取默认打印机
Printer.printerName();
设置打印机打印份数
Printer.setNumCopies(2);
设置打印顺序
Printer.setPageOrder(QPrinter::PageOrder);
(PageOrder此处为枚举值)
从第一页开始:FirstPageFirst 从最后一页开始:LastPageFirst
2)界面设置
QPrintDialog *pPrintDialog = new QPrintDialog(&Printer);
pPrintDialog->exec();
修改后点击应用,即可修改打印机设备参数
(2)页设置
1)代码设置
设置页边距
Printer.setPageMargins(6,6,6,6,QPrinter::Millimeter);
页面方向设置
Printer.setOrientation(QPrinter::Orientation);(QPrinter::Landscape常用)(Orientation(纵向:Portrait 横向:Landscape))
纸张来源
Printer.etPaperSource(QPrinter::PaperSource);
(PaperSource类型为枚举值)此处枚举值过多不一一列举
设置纸张大小
Printer.setPageSize(QPrinter::PageSize);(QPrinter::A4常用)
(PageSize类型为枚举值)此处枚举值过多不一一列举
2)界面设置
QPageSetupDialog *PageSetupDialog = new QPageSetupDialog (&Printer);
PageSetupDialog->exec();
2. 打印流程
(1)打印设置
通过对QPrinter Printer;设置,设置详见(1打印设置)
(2)文档打印
QTextDocument *pDoc = new QTextDocument;
设置内容
pDoc ->setHtml(strHtml);
此处strHtml为html格式的文档
注:当打印doc/docx格式文档时需要先转换为html(因为有格式问题),如果其他的,但是需要调用pDoc->setPlainText(const QString &text)
pDoc->print(&Printer);
将文档打印到给定的打印机。必须先设置QPageablePaintDevice(即QPrinter),然后才能使用此功能
(3)图片打印
加载图片资源
QPixmap pixmap;
pixmap.load(strFile);(strFile为图片资源路径)
QPainter painterPixmap;
将打印机设备和QPainter 绑定开始打印
painterPixmap.begin(&Printer);
QRect rect = painterPixmap.viewport();
int x = rect.width() / pixmap.width();
int y = rect.height() / pixmap.height();
painterPixmap.scale(x, y);
painterPixmap.drawPixmap(0, 0 , pixmap);
painterPixmap.end();
QPainter调用end则打印结束
注:QPainter画的内容都可以用此方法打印,QPainter调用begin开始(需要以QPrinter作为传入参数),调用end结束。
如果要画多页需要在begin和end之间调用QPrinter::newPage();
3. 打印预览
打印预览界面
QPrintPreviewDialog *pPreviewDialog = new QPrintPreviewDialog(&Printer);
connect(pPreviewDialog , QPrintPreviewDialog::paintRequested,this,QtPrint::slotPintPreview);//关联打印预览的内容
pPreviewDialog ->resize(1000,900);
pPreviewDialog ->exec();
delete pPreviewDialog ;
pPreviewDialog = nullptr;
槽函数slotPintPreview:
打印以及预览内容需要在槽函数里面设置
Void slotPintPreview(QPrinter *printer)
{
设置打印内容
详见2打印流程->(2)文档打印/(3)图片打印
}
打印预览界面
#ifndef QTPRINT_H
#define QTPRINT_H
#include <QObject>
class QPrinter;
class QTextDocument;
class QPrintDialog;
class QPrintPreviewDialog;
class QPageSetupDialog;
class QtPrint : public QObject
{
Q_OBJECT
public:
explicit QtPrint(QObject *parent = nullptr);
~QtPrint();
enum ShowDialogType
{
NODialog = 0,
DialogPrint,
DialogPageSetup,
};
Q_SIGNALS:
public Q_SLOTS:
void slotPintPreview(QPrinter *);
public:
void setFilePath(QString strfile);
bool print(ShowDialogType type = DialogPrint);
bool showPreviewDialog();
void printImage();
private:
QString wordToHtml();
void inPrint();
private:
QString m_strFile = "";
QString m_strHtml = "";
bool m_bIsdoc = true;
QPrinter *m_pPrinter;
QTextDocument *m_pDoc;
QPrintDialog *m_pPrintDlg;
QPrintPreviewDialog *m_pPreviewDialog;
QPageSetupDialog *m_pPageSetupDialog;
};
#endif // QTPRINT_H
#include "QtPrint.h"
#include <QPrintDialog>
#include <QPrintPreviewDialog>
#include <QTextEdit>
#include <QTextDocument>
#include <QPrintPreviewWidget>
#include <QPageSetupDialog>
#include <QPrintDialog>
#include <QFile>
#include <QDir>
#include <QAxWidget>
#include <QTextStream>
#include <QPainter>
QtPrint::QtPrint(QObject *parent) : QObject(parent)
,m_pPrinter(nullptr)
,m_pDoc(nullptr)
,m_pPrintDlg(nullptr)
,m_pPreviewDialog(nullptr)
,m_pPageSetupDialog(nullptr)
{
m_pDoc = new QTextDocument;
m_pPrinter=new QPrinter();
m_pPrinter->setOutputFormat(QPrinter::NativeFormat);
//获取打印机设备列表
// QStringList strlist = QPrinterInfo::availablePrinterNames();
// //手动设置打印机默认显示
// m_pPrinter->setPrinterName(printer.printerName());//设置打印机设备名称
// m_pPrinter->setPageSize(QPrinter::A4);//设置纸张大小
// m_pPrinter->setNumCopies(2);//设置打印机打印份数
// m_pPrinter->setPageMargins(6,6,6,6,QPrinter::Millimeter);//设置页边距
// m_pPrinter->setOrientation(QPrinter::Landscape);//纵向:Portrait 横向:Landscape
// m_pPrinter->setPageOrder(QPrinter::FirstPageFirst);//从第一页开始:FirstPageFirst 从最后一页开始:LastPageFirst
// m_pPrinter->setPaperSource(QPrinter::OnlyOne);//纸张来源
// m_pPrinter->setOrientation(QPrinter::Landscape);//纵向:Portrait 横向:Landscape
// m_pPrinter->setPageSize(QPrinter::A4);//设置纸张大小
//打印設置QPrinter
m_pPrintDlg=new QPrintDialog(m_pPrinter);//打印界面
//打印頁設置
m_pPageSetupDialog = new QPageSetupDialog(m_pPrinter);//頁設置界面
}
QtPrint::~QtPrint()
{
if(m_pPrinter)
{
delete m_pPrinter;
}
if(m_pDoc)
{
delete m_pDoc;
}
if(m_pPrintDlg)
{
delete m_pPrintDlg;
}
if(m_pPreviewDialog)
{
delete m_pPreviewDialog;
}
if(m_pPageSetupDialog)
{
delete m_pPageSetupDialog;
}
}
void QtPrint::slotPintPreview(QPrinter *p)
{
inPrint();
}
void QtPrint::setFilePath(QString strfile)
{
if(strfile.isEmpty())
return;
m_strFile = strfile;
//如果是图片
QStringList docList;
docList<<"doc"<<"docx";
QString strSuffix = m_strFile.split(".").last();
if(!docList.contains(strSuffix))
{
m_bIsdoc = false;
}
else
{
m_strHtml = wordToHtml();
m_bIsdoc = true;
}
}
bool QtPrint::showPreviewDialog()
{
//打印預覽窗口
m_pPreviewDialog = new QPrintPreviewDialog(m_pPrinter);//打印預覽界面
connect(m_pPreviewDialog, QPrintPreviewDialog::paintRequested,this,QtPrint::slotPintPreview);//关联打印预览的内容
m_pPreviewDialog->resize(1000,900);
m_pPreviewDialog->exec();
delete m_pPreviewDialog;
m_pPreviewDialog = nullptr;
}
bool QtPrint::print(ShowDialogType type)
{
bool bSuccess = false;
if(type == NODialog)
{
bSuccess = true;
inPrint();
}
else if(type == DialogPrint)
{
if(m_pPrintDlg->exec() == QDialog::Accepted)
{
bSuccess = true;
inPrint();
}
}
else if(type == DialogPageSetup)
{
if(m_pPageSetupDialog->exec() == QDialog::Accepted)
{
bSuccess = true;
}
}
return bSuccess;
}
QString QtPrint::wordToHtml()
{
QString fileName=m_strFile;//输入一个doc或docx格式文件的路径
QAxWidget *a = new QAxWidget("Word.Application");//打开Word Class ID
a->setControl(fileName);//打开此Word文档
a->setProperty("Visible",false);//设置程序不显示
QVariant newFileName;
if(fileName.endsWith(".docx"))
{
newFileName.setValue(fileName.left(fileName.size()-5).append(".html"));
}
else if(fileName.endsWith(".doc")){
newFileName.setValue(fileName.left(fileName.size()-4).append(".html"));
}
QVariant fileFormat(10); //文件保存格式 HTML文件 这个值有几个枚举类型具体参考:WdSaveFormat枚举 //下面参数几个默认即可
QVariant LockComments(false);//注释
QVariant Password("");//设置打开密码
QVariant recent(false);//最近打开的文件
QVariant writePassword("");//写入密码
QVariant ReadOnlyRecommended(false