一.前言
楼主在上篇文章:Qt笔记(四十七)之QPrinter方式导出PDF
讲述了QPrinter导出PDF的基本思路,这篇文章就记录下Qt5导出PDF的领另一种思路,即是QPdfWriter+QFile
二.流程
1.基本思路
》QFile创建文件
》QPdfWriter设置PDF的属性
》QPainter绘制内容
2.核心代码
void PdfWidget::on_pushButton_2_clicked()
{
QString pdfName = "E://"+QDateTime::currentDateTime().toString("yyyy-MM-dd-HH-mm-ss")+".pdf";
QString pdfPath = QFileDialog::getSaveFileName(this,"QPdfWriter方式导出PDF",pdfName,"*.pdf");
if(pdfPath.isEmpty())
return;
QFile pdfFile(pdfPath);
if(pdfFile.open(QIODevice::WriteOnly))
{
// 实例化写入对象
QPdfWriter *writer = new QPdfWriter(&pdfFile);
// 设置纸张属性(ps:有反馈说设置其他纸张类型,但是打印机还是A4的格式,楼主没有打印件 所以没得测试 有条件可以测试下)
writer->setPageSize(QPagedPaintDevice::A4);
// 设置dpi 好像基本都是设置300像素
writer->setResolution(300);
// 设置边距
writer->setPageMargins(QMarginsF(20,20,20,20));
QPainter *painter = new QPainter(writer);
painter->setFont(QFont("宋体",13));
// 开始绘制内容
int start = 10;
painter->drawText(QRect(0,start,writer->width(),100),Qt::AlignCenter,"标题");
start+=120;
// QPen pen;
// pen.setColor(Qt::gray);
painter->setPen(QPen(QBrush(QColor(0,0,0)),5));
painter->drawLine(0,start,writer->width(),start);
start+=120;
painter->drawText(QRect(0,start,writer->width(),100),Qt::AlignLeft,"标题1");
delete painter;
painter=nullptr;
delete writer;
writer = nullptr;
// 打开
QDesktopServices::openUrl(pdfPath);
pdfFile.close();
}
}
3.其他
1.楼主觉得绘制pdf的内容位置,是要自己计算的,应该做不了通用的pdf文件导出
2.至于计算内容位置,楼主倒是有感觉在调css的感觉,边写程序边调整,效率应该是慢了点,或者可以考虑采用类似html方式布局好,然后再去对应的计算逻辑