qt中有两种方式可以输出pdf:
方式1:使用QPrinter即打印机的方式打印pdf
这种方式,在qt4成为唯一的方式。
QPrinter printer(QPrinter::HighResolution); //高清晰度
printer.setPageSize(QPrinter::A4); //设置纸张大小
printer.setResolution(300); //设置清晰度,即dpi ,每个平方英寸像素为300
printer.setOutputFormat(QPrinter::PdfFormat); //设置导出类型
QPainter *painter = new QPainter();
painter->begin(&printer);
//显示文本
painter->drawText(50,50,ui->label->text());
//画横线
painter->drawLine(0,375,1500,375);
//显示图片
QPixmap pixmap("C:\\xx.png");
painter->drawPixmap(0,0,pixmap);
painter->end();
delete painter;
painter = Q_NULLPTR; //养成编程好习惯,回收对象要置空
相关博客:
方式2:QPdfWriter方式输出pdf文档
qt5的版本,qt提供了一个独立的pdf文件写入方式,那就是QPdfWriter,所以咱们当然用QPdfWriter啦。
正确使用的示例代码如下:
//截取软件的界面作为截图,打印到pdf里
QPixmap pix=QWidget::grab(QRect(tmp,ui->customPlot->size()));
QFile pdfFile(path);
QPdfWriter *pdfWriter = new QPdfWriter(&pdfFile); //实例化QPdfWriter
//设置分辨率,ScreenResolution, PrinterResolution(已经弃用),
//HighResolution(和ScreenResolution效果一样)
pdfWriter->setResolution(QPrinter::ScreenResolution);
pdfWriter->setPageSize(QPagedPaintDevice::A8); //设置纸张为A8纸大小
//下面这行代码也是可以调整页面大小的,单位为毫米,如果加减一个大点的数,是有效果的
//pdfWriter->setPageSizeMM(QSizeF(pix.widthMM(),pix.heightMM()));
//实例化QPainter,这里特别注意:pdf输出大小,是由这个QPainter决定的,
//所以实例化这个QPainter时,确保pdfWriter已经被设置完成,否则后面再设置的话
//是不会起作用的。要么就调用pdfWriter->newPage()函数,才会起作用,但是会新起一页了
QPainter *pic_painter = new QPainter(pdfWriter);
//计算painter视口区域与抓取图片区域的尺寸比例因子
QRect rect = pic_painter->viewport();
//绘制时按照比例因子放大
pic_painter->scale(factor,factor);
//按照坐标画图
pic_painter->drawPixmap(0,0,pix);
delete pic_painter;
delete pdfWriter;
pdfFile.close();
//实例化QPainter,这里特别注意:pdf输出大小,是由这个QPainter决定的,
//所以实例化这个QPainter时,确保pdfWriter已经被设置完成,否则后面再设置的话
//是不会起作用的。要么就调用pdfWriter->newPage()函数,才会起作用,但是会新起一页了。典型的例子就是设置页面大小setPageSize或者setPageSizeMM函数设置的页面大小不起作用。
第二个问题:QPainter只能是一个实例设置到pdfWriter,不能多个实例弄上去,否则newPage()会不起作用,看这个例子:c++ 无法使用QPdfWriter在pdf文件中添加新页面 _大数据知识库
遇到这个问题的博客例子:
Qt使用QPDFWriter和QPainter生成PDF的问题_52_赫兹的鲸的博客-CSDN博客
通过QTextDocument打印到QPdfWriter
由于用QPainter打印到QPdfWriter需要自己去计算好每一个坐标(Qt 生成pdf文件_qt生成pdf_小鱼仙官的博客-CSDN博客,Qt开发-ui导出pdf格式 - 知乎),挺麻烦的,所以,用QTextDocument可以支持的html直接打印上去的,所以对于格式化需求,这个就太好了,具体的参考博客:(十七)QT生成PDF文件_qt 生成pdf_sunatmine的博客-CSDN博客