• 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();
        }
    }
  • 相关阅读:
    ZOJ 3327 Friend Number
    ZOJ 3324 Machine
    2010-2011 ACM-ICPC, NEERC, Southern Subregional Contest C Explode 'Em All
    UVA 12594 Naming Babies
    POJ 3709 K-Anonymous Sequence
    POJ 1180 Batch Scheduling
    POJ 1160 Post Office
    HDU 3516 Tree Construction
    HDU 3045 Picnic Cows
    UVALive 5097 Cross the Wall
  • 原文地址:https://www.cnblogs.com/lvdongjie/p/14664520.html
Copyright © 2020-2023  润新知