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);//只读 a->dynamicCall("SaveAs(const QVariant&, const QVariant&,const QVariant&, const QVariant&, const QVariant&, const QVariant&,const QVariant&)", newFileName,fileFormat,LockComments,Password,recent,writePassword,ReadOnlyRecommended); //读取保存后的html文件---编辑结束后即可删除临时生成的html文件 QString newFileName2 = newFileName.toString(); QFile NewFile(newFileName2); NewFile.open(QIODevice::ReadOnly); QTextStream stream(&NewFile); QString strhtml = stream.readAll(); //刪除生成html文件 NewFile.remove(); delete a; a = nullptr; return strhtml; } void QtPrint::printImage() { QPixmap pixmap; pixmap.load(m_strFile); if(pixmap.isNull()) { //报错 return ; } QPainter painterPixmap; painterPixmap.begin(m_pPrinter); 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);//设置图像在A4中的开始坐标是什么 painterPixmap.end(); } void QtPrint::inPrint() { if(m_bIsdoc) { m_pDoc->setHtml(m_strHtml); m_pDoc->print(m_pPrinter); } else { printImage(); } }


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM