QT之打印文檔,照片


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