您的位置:首页 > 编程语言 > Qt开发

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

2017-07-19 10:47 489 查看
由于工作中需要将应用程序的某些界面截图,并加上注释,并输出为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自定义绘图**************************************/
}
else
QMessageBox::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."));

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐