Qt下利用Qprinter或者QPdfWriter导出文件为PDF

来源:互联网 发布:windows会员计划好处 编辑:程序博客网 时间:2024/06/15 10:52

由于工作中需要将应用程序的某些界面截图,并加上注释,并输出为PDF文件,在网上查阅了一些资料,整理汇总后发现有两种方法:一是Qt4版本利用QPrinter将文件输出为PDF。而是Qt5版本写新出的类QPdfWriter,更加快捷精准输出为PDF文件。两者的相同之处都是利用QPainter在其中绘制PDF文件。

在Qt4版本下利用QPrinter将某个控件,或者利用QWidget::grab将控件或界面输出为PDF,详细代码及注释如下:

在Qt5版本选利用QPdfWriter将Qpainter的文件输出为PDF


    //利用QPrinter输出为PDF格式并设置分辨率及纸张尺寸    QPrinter pic_printer(QPrinter::ScreenResolution);       //设置分辨率    pic_printer.setPageSize(QPrinter::A4);                  //设置纸张尺寸,默认不设置就是A4    pic_printer.setOutputFormat(QPrinter::PdfFormat);       //设置输出格式pdf    //用文件对话框设置输出路径    QString file_path = QFileDialog::getSaveFileName(this,"Export PDF",QString(),"*.pdf");    if(!file_path.isEmpty())    {        //如果没有写后缀就自动加上        if(QFileInfo(file_path).suffix().isEmpty())            file_path.append(".pdf");        pic_printer.setOutputFileName(file_path);           //设置文件名        /*****************************************绘制图片*****************************************/        QPixmap pixmap=QWidget::grab(QRect(ui->qcustomplot->x(),ui->qcustomplot->y(),ui->qcustomplot->frameGeometry().width(),ui->qcustomplot->frameGeometry().height()+10)); //抓取界面widget区域,可以抓取任意控件区域,Qt5推荐新的API QWidget::grab        QPainter pic_painter;        pic_painter.begin(&pic_printer);                //在QPrinter上绘图        QRect rect=pic_painter.viewport();              //获取painter的视口区域        int factor=rect.width()/pixmap.width();         //计算painter视口区域与抓取图片区域的尺寸比例因子        pic_painter.scale(factor*0.6,factor*0.6);       //绘制时按照比例因子放大        pic_painter.drawPixmap(10,10,pixmap);           //按照坐标画图
        /***********************以下可利用QPainter自定义绘图**************************************/    }    elseQMessageBox::warning(this,tr("Path"),tr("You did not select any file."));

/**********************************************Qt5版本QPdfWriter*****************************************************/

    QString path = QFileDialog::getSaveFileName(this,tr("Open File"),".",tr("PDF Files(*.pdf)"));   //利用QFileDialog对话框选择文件存储路径    if(!path.isEmpty())    {        //如果没有写后缀就自动加上        if(QFileInfo(path).suffix().isEmpty())            path.append(".pdf");        //实例化该文件,并以只写的方式打开        QFile pdfFile(path);        if(!pdfFile.open(QIODevice::WriteOnly))        {            QMessageBox::warning(this,tr("write File"),tr("Cannot open file:\n%1").arg(path));            return;        }        QPdfWriter *pdfWriter = new QPdfWriter(&pdfFile);               //实例化QPdfWriter        QPainter *pic_painter = new QPainter(pdfWriter);                //实例化QPainter        pdfWriter->setPageSize(QPagedPaintDevice::A4);                  //设置纸张为A4纸        pdfWriter->setResolution(QPrinter::ScreenResolution);           //设置分辨率/******************************************************以下为自定义绘图**************************************/delete pic_painter;        delete pdfWriter;        pdfFile.close();    }    else        QMessageBox::warning(this,tr("Path"),tr("You did not select any file."));