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(