Qt打印实战:用QPrinter实现表格数据导出PDF(附完整代码)

Qt打印实战:基于QPrinter的高效表格与文档输出 本文深入探讨了Qt框架中基于QPrinter类实现高效表格与文档打印的实战方法。通过解析QPrinter的核心机制,详细介绍了如何配置打印机参数、利用QTextDocument结合HTML生成精美表格、集成预览与打印对话框,并分享了跨平台兼容性处理、性能优化及常见问题解决方案,帮助开发者快速构建稳定、专业的桌面应用打印功能。 阅读详情

Qt表格数据导出PDF实战:QPrinter高级应用与问题解决

在Qt应用开发中,数据导出是常见的需求场景。当我们需要将表格数据以专业格式输出时,PDF无疑是最佳选择之一。本文将深入探讨如何利用QPrinter实现表格数据的高质量PDF导出,解决实际开发中的分页、编码和性能问题。

1. QPrinter核心机制与PDF导出基础

QPrinter作为Qt打印系统的核心类,本质上是一个特殊的绘图设备。与QWidget和QPixmap不同,它专门用于生成打印输出,支持从传统纸质打印到现代PDF文件生成等多种输出形式。

初始化QPrinter为PDF设备只需几行代码:

QPrinter printer(QPrinter::HighResolution);
printer.setOutputFormat(QPrinter::PdfFormat);
printer.setOutputFileName("output.pdf");

关键配置参数包括:

  • 分辨率:HighResolution(高质量)或ScreenResolution(快速输出)
  • 页面尺寸:A4、Letter等标准纸张规格
  • 边距设置:毫米或英寸为单位
  • 方向:纵向(Portrait)或横向(Landscape)

实际开发中常见的初始化问题往往源于模块依赖。确保在.pro文件中添加:

QT += printsupport

2. 表格数据渲染的核心技术

将QTableWidget或QTableView中的数据导出到PDF,需要解决三个关键技术点:内容提取、格式转换和页面布局。

内容提取的典型实现:

QStringList headers;
for(int col=0; col<table->columnCount(); ++col) {
    headers << table->horizontalHeaderItem(col)->text();
}

QVector<QStringList> tableData;
for(int row=0; row<table->rowCount(); ++row) {
    QStringList rowData;
    for(int col=0; col<table->columnCount(); ++col) {
        rowData << table->item(row, col)->text();
    }
    tableData.append(rowData);
}

HTML转换方案相比直接绘图更易实现复杂格式:

<table border="1" cellspacing="0" style="border-collapse:collapse">
  <thead>
    <tr>
      <th>姓名</th>
      <th>年龄</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>张三</td>
      <td>28</td>
    </tr>
  </tbody>
</table>

在Qt中通过QTextDocument实现HTML渲染:

QTextDocument doc;
doc.setHtml(htmlContent);
doc.print(&printer);

3. 处理复杂表格的实战技巧

当表格列数较多或内容超长时,需要特殊处理以保证输出质量。

自动分页方案:

// 计算内容高度
qreal contentHeight = calculateContentHeight(); 

// 获取页面可用高度
qreal pageHeight = printer.pageRect().height();

if(contentHeight > pageHeight) {
    printer.newPage();  // 内容超出一页时换页
    // 重新绘制表头
    drawTableHeader(); 
}

列宽自适应算法:

QVector<int> colWidths;
qreal totalWidth = printer.pageRect().width();

// 根据内容计算每列宽度
for(int col=0; col<headers.size(); ++col) {
    int maxLen = headers[col].length();
    for(auto& row : tableData) {
        maxLen = qMax(maxLen, row[col].length());
    }
    colWidths.append(maxLen * charWidth); // 字符宽度估算
}

// 等比例缩放至页面宽度
qreal scale = totalWidth / std::accumulate(colWidths.begin(), colWidths.end(), 0);
for(auto& w : colWidths) w *= scale;

中文字符支持必须设置正确的编码和字体:

QFont font("SimSun", 10);  // 使用宋体
painter.setFont(font);

// HTML方式需指定meta和样式
QString htmlHeader = 
    "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">"
    "<style>body { font-family: SimSun; }</style>";

4. 高级功能实现与性能优化

带预览的打印流程显著提升用户体验:

QPrinter printer(QPrinter::HighResolution);
QPrintPreviewDialog preview(&printer);

QObject::connect(&preview, &QPrintPreviewDialog::paintRequested,
    [&](QPrinter* previewPrinter) {
        renderContent(previewPrinter);
    });

preview.exec();

多线程渲染防止界面卡顿:

class RenderTask : public QObject {
    Q_OBJECT
public:
    void render(QPrinter* printer) {
        // 耗时渲染操作
        emit finished();
    }
signals:
    void finished();
};

// 在主线程中
QThread* workerThread = new QThread;
RenderTask* task = new RenderTask;
task->moveToThread(workerThread);

connect(workerThread, &QThread::started, [=]() {
    task->render(&printer);
});
connect(task, &RenderTask::finished, workerThread, &QThread::quit);

PDF元数据设置增强文件专业性:

printer.setCreator("My Qt Application");
printer.setDocName("Sales Report Q2");
printer.setColorMode(QPrinter::Color);

实际项目中,我曾遇到一个包含5000行数据的表格导出需求。通过以下优化将导出时间从15秒降至3秒:

  1. 预计算所有页面布局
  2. 使用QTextDocument缓存机制
  3. 关闭非必要的抗锯齿效果
  4. 分批处理超大数据集

5. 典型问题排查与解决方案

乱码问题通常由以下原因导致:

  1. 未设置中文字体
  2. HTML未指定UTF-8编码
  3. 系统缺少相应字体

内容截断检查点:

  • 页面边距设置是否合理
  • 内容坐标系是否考虑设备DPI
  • 是否在painter.end()前完成所有绘制

内存泄漏防范:

// 正确释放资源
QTextDocument* doc = new QTextDocument;
// ...使用文档...
doc->deleteLater();  // 而非直接delete

一个实际案例:某金融系统导出报表时,发现数字对齐异常。问题根源在于等宽字体未生效,解决方案是:

QFont font("Courier New", 9);  // 使用等宽字体
painter.setFont(font);

6. 扩展应用:动态表格与混合内容

结合QPainter直接绘制和HTML渲染,可以实现图文混排效果:

// 绘制标题和logo
painter.drawPixmap(rect, logo);
painter.drawText(headerRect, Qt::AlignCenter, "季度报表");

// 渲染HTML表格
QTextDocument doc;
doc.setHtml(tableHtml);
doc.drawContents(&painter, contentRect);

对于动态列的情况,可采用模型-视图分离的设计:

class PrintModel : public QAbstractTableModel {
    // 实现数据接口
};

PrintModel printModel;
printModel.setSourceData(data);

QTableView view;
view.setModel(&printModel);
view.render(&painter);

7. 跨平台注意事项

不同平台的差异主要在于:

  • 字体可用性(Linux可能需要额外配置)
  • PDF阅读器对特性的支持程度
  • 默认DPI设置(影响尺寸精度)

推荐的兼容性处理方式:

// 检查字体可用性
QStringList availableFonts = QFontDatabase::families();
if(!availableFonts.contains("Arial")) {
    font = QFont("Noto Sans CJK SC");  // 回退字体
}

// 统一使用毫米作为单位
printer.setPageSize(QPageSize(QPageSize::A4));
printer.setPageMargins(QMarginsF(15, 15, 15, 15), QPageLayout::Millimeter);

在最近的一个跨平台项目中,我们发现Mac系统上边距表现与Windows不同。最终通过统一使用QPageLayout解决了这一问题:

QPageLayout layout = printer.pageLayout();
layout.setUnits(QPageLayout::Millimeter);
layout.setMargins(QMarginsF(20, 20, 20, 20));
printer.setPageLayout(layout);
Qt 打印(基于QPrinter类) Qt 打印(基于QPrinter类) 日期 作者 版本 2021年07月05日 Mister H V1.0 目录Qt 打印(基于QPrinter类)简介创建QPrinter对象存储内容并打印 简介 QPrinter类是一个在打印机上绘制的绘制设备。基于printsupport模块,该设备表示一系列打印输出页面,其使用方式与其他绘图设备(如QWidget和QPixmap)几乎完全相同。还提供了一组附加功能来管理特定于设备的特性,如方向和分辨率,并在生成文档时逐步浏览文档中的页面。 创建QP 阅读详情

相关推荐

Qt之导出PDF、HTML和Word(一)

内容提要: 1,Qt导出文件的基本原理; 2,QPrinter、HTML和PDF; 3,HTML编辑器; 4,HTML和Word; 5,qwt的图片和pdf导出 一、Qt绘图和导出文件的基本原理 Qt的二维图形引擎是基于QPainter类的。QPainter既可以绘制几何形状(点、线、矩形、椭圆、弧形、弦行、饼状图、多边形和贝塞尔曲线),也可以绘制像素映射、图像和文字。(参考《C++ GUI

Sagittarius_Warrior的博客 1万+

qt输出自定义的pdf文件源码详解

qt中有两种方式可以输出pdf: /是不会起作用的。要么就调用pdfWriter->newPage()函数,才会起作用。典型的例子就是设置页面大小setPageSize或者setPageSizeMM函数设置的页面大小不起作用。qt5的版本,qt提供了一个独立的pdf文件写入方式,那就是QPdfWriter,所以咱们当然用QPdfWriter啦。这种方式,在qt4成为唯一的方式。,否则后面再设置的话。

biao2488890051的博客 3577

Qt访问打印机及打印为PDF文档

C++访问打印机似乎无从下手。但是QT却让这个事情简单化、透明化了。 一、访问打印机 只需要使用 QPrinter、QTextDocument两个类,已经可以满足很多场景: QPrinter printer; // 创建一个打印机,连接当前电脑的默认打印机 QTextDocument textDocument; // 创建QTextDocument对象 QString h...

lyx_2004的博客 2818

Qt打印,QPdfWriter,QPrinter,QPrintPreviewWidget

介绍qt与pdf、打印等相关的只是内容。

qq_37033647的博客 4316

Qt打印功能实战:基于QPrinter的表格与图像输出

本文深入解析Qt框架中基于QPrinter的打印功能实战,详细介绍了如何从零开始配置打印机对象、设置高分辨率输出模式,并重点演示了使用QPainter绘制动态数据表格、嵌入图像以及实现多页文档分页控制的核心技巧。文章还分享了利用QPrintPreviewDialog进行打印预览、使用QTextDocument处理复杂HTML文档等高级方法,帮助开发者高效实现桌面应用的报表与图像输出需求。

weixin_29243063的博客 307

Qt之使用QPrinter导出PDF

Qt之使用QPrinter导出PDF,如果要新建一页,可以调用bool QPrinter::newPage(),使用QPrinter导出的PDF有个很明显的缺点:没有书签,如果PDF页数较多,这种方式其实是不太行的。

草上爬的博客 3万+

Qt使用QPrinter生成多页pdf文档

Qt使用QPrinter生成多页pdf文档

初夏夕空的博客 3162

QPrinter 是 Qt 框架中的一个类,用于与打印机进行交互,并提供打印功能

QPrinter 是 Qt 框架中的一个类,用于与打印机进行交互,并提供打印功能。QPrinter 类封装了打印机的属性和操作,可以用于生成打印输出,如打印文本、图形、表格等内容。它提供了一种通用的接口,使开发人员能够以跨平台的方式访问和控制打印机。以下是 QPrinter 类的一些常见用法:设置打印参数:通过 QPrinter 的方法,如等,可以设置打印页面的大小、方向、输出格式等参数。

m0_46376834的博客 5890

Qt/C++数据库应用3-数据打印到pdf

一、前言 自从数据可以导出到xls,又有客户提出了不同的需求,比如既然可以将数据导出到xls,那是否可以导出到pdf文件呢?因为xls打开以后用户可以修改数据造假之类的,而pdf默认是不可编辑的,除非借助专业的工具,所以如果想要限定用户导出数据不能被更改,那导出pdf是最佳选择。写程序往往都是这样,一步步慢慢增加,随着用户需求的增加,程序量也越来越多,轮子组件也越来越多。往往客户提需求的时候,一定要认真聆听,尤其是一线用户,实际使用的用户,尽管有些不合理的需求,但是能满足就尽量满足,毕竟客户就是上帝。 在Q

Qt/C++视频监控/推流/物联网/大屏系统/自定义控件/UI定制/输入法 2861

使用QPrinter生成pdf或用打印机打印数据 - 恒月美剑 - 博客园1

1.使用html生成表格 1. Re:Qt-字体轮廓的绘制 2.生成pdf文档 3.使用打印机打印 3. Re:Qt-字体轮廓的绘制 4. Re:Qt-字体轮廓

STM32踩坑--NoST-LINK detected

这里出现的NoST-LINK detected是没有扫描到端口 在我使用一段Fly-MCU后,有一天突然发现出现如上错误,再检查的过程中检查以下几点 1.STM32 魔术棒的设置 1.1Debug设置 1.2 utilities 设置没有问题,与原来一样又看了下端口——在设备管理器中;也没有问题 ...

qq_53002477的博客 2万+

Qt开发:生成pdf文件

Qt4中用QPrinter实现 QPrinter不止可以操作打印机来打印纸张文件,并且可以将文件保存至磁盘,存储为pdf格式的文件。 首先在pro文件中加入  QT+=printsupport 然后包含头文件 #include 文本生成pdf: //文本生成pdf QPrinter text_printer; //文本生成不要设置resolution,否

踏莎行的博客 1万+

MATLAB 2022b 用户专属:保姆级IPOPT求解器安装配置全流程(含OPTI工具箱)

本文为MATLAB 2022b用户提供IPOPT求解器的详细安装与配置指南,涵盖OPTI工具箱的适配安装、环境变量设置及常见问题解决方案。通过实战案例演示非线性优化问题的求解过程,帮助用户高效部署这一强大的优化工具,提升工程计算效率。

weixin_29092031的博客 407

QT中QPrinter打印功能

这两天处理了一下QT程序连接网络打印机执行打印的功能 描述:QT程序运行在Linux、Windows平台,软件运行过程中可根据用户的需要生成一系列的报表,现在需要将这些数据自动布局成报表的格式,并实现一键打印功能,如下:点击打印报表即可跳转到打印预览界面,并将当前界面的信息进行布局打印 在windows下QPrinter使用系统的打印驱动程序,能够很方便的使用打印功能 在Linux下,先...

xumingyifrend的博客 1万+

ECharts 实现世界地图

效果图 源代码(仅供参考) <template> <div class="echarts"> <div class="className" id="id" style="width: 100%; height: 450px" ref="myEchart" ></div> </div> </template> <script lang="ts"> imp

EsquireY的博客 4876

初学树莓派——(九)DHT11数据传入ONENET

目录 前言 DHT11实现本地温湿度监测 DHT11.py 接线图 效果图 温湿度数据上传至ONENET 新建产品 新建设备 ONENET.py 测试 Shell脚本配置 效果图 前言 本文分部分实现温湿度上传至OneNet云平台,本地数据监测,数据上传 新建一个文件夹,文件夹内包含DHT11.py、ONENET.py、tmp_data.txt、hum_data.txt DHT11实现本地温湿度监测 DHT11.py import RPi.GPIO as GPIO

会点灯的大力水手的博客 2613

Qt实现保存、浏览、预览、打印功能

        Qt提供了以文本、图片、HTML等方式来实现对文档的操作,主要用到了QPrinter类和QPainter类,用到了QFileDialog文件窗口、QPrintPreviewDialog预览窗口类和QPrintDialog打印窗口类,Qt5也提供了QPdfWriter类来实现对pdf的操作,这里并不包括打开pdf文件,Qt没有提供任何方法来直接像文件浏览器一样打开pdf文件,可以用第...

画茧自缚 2万+

利用baostock获取上市公司财务指标

利用baostock获取上市公司的财务指标 1、导入模块,登录baostock import baostock as bs import pandas as pd import time # 登陆系统 lg = bs.login() # 显示登陆返回信息 print('login respond error_code:'+lg.error_code) print('login respond error_msg:'+lg.error_msg) 2、查询股票代码、行业板块 # 查询股票代码 rs=.

firefox_yau的博客 2100

【Qt开发流程】之打印文档

【Qt开发流程】之打印文档

FreeLikeTheWind的博客 3320

论文阅读:ICLR 2026 Breaking and Fixing Defenses Against Control-Flow Hijacking in Multi-Agent Systems

该论文首先系统阐述了控制流劫持攻击的核心机理。此类攻击通过操纵多智能体系统的编排机制,诱导系统执行非安全操作,进而实现敏感信息窃取。攻击者将恶意指令伪装成环境错误信息,借助可信代理传递至系统编排器,利用"困惑副手"漏洞绕过传统安全防线。该论文指出,现有防御方案如LlamaFirewall所依赖的对齐检查机制存在根本性局限——安全目标与功能需求之间存在不可调和的内在冲突。该论文的核心贡献体现在攻防两个维度。

CSPhD-winston的博客 495

腾讯微搭低代码开发实战电子书:医疗挂号小程序

本书通过一个完整的“医疗挂号小程序”项目,深度讲解腾讯微搭(WeDa)低代码平台在复杂业务场景下的实战应用。从登录体系搭建、用户注册,到就诊人管理、科室排班与预约下单,全程遵循“配置+逻辑+实战”的思路,带领读者从零实现具备商业级可用性的医疗挂号小程序,掌握低代码开发的核心技巧与业务落地能力。

低代码布道师的博客 955

qt 打印 QPrinter类

qt的打印主要使用QPrinter类,即打印类。 但是,必须会使用辅助类QPainter,即绘制类。 在打印机上绘制图形。   Qt中如何让图片、文本、HTML或者其他形式的内容生成pdf呢?主要利用QPrinter来实现,QPrinter不止可以操作打印机来打印纸张文件,并且可以将文件保存至磁盘,存储为pdf格式的文件。 图片生成pdf 代码如下: QPr

证券指标的专栏 1万+

SAP_MM模块非限制库存转冻结库存

项目非限制 → 冻结事务码移动类型343影响库存不可用,不参与MRP常见用途质量问题封存、盘点冻结、待退货品通过本文,我们了解了 SAP 的[SAP_MM模块非限制库存转冻结库存]的基本概念和应用方法。希望这些信息能帮助您在实际工作中更好地使用 SAP 系统,提高工作效率和管理水平。更多SAP文章请点击更多SAP文章更新,大家一起学习进步!!!文章中如有错误。敬请指正!搜索公众号:SAP资料文库微信号:SPRO_PP时间:2025-10-14。

我小时候很黑的博客 590

QPrinter QPrintDialog QPrintPreviewDialog 打印PDF文件

近期做了一个项目,这个项目需要调用QT 的通用接口实现跨平台打印pdf文件,遇到了一些坑特此纪录一下。 1, QPrinter printer(QPrinter::ScreenResolution);//构造打印对象 printer.setPageSize(QPrinter::A4);//页面设置 printer.setOrientation(QPrinter::Port...

fxbjye的博客 3825

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

贝叶斯统计 [韦来生编]

贝叶斯(Bayes)统计是近几十年来迅速发展起来的数理统计的一个重要分支。贝叶斯方法与经典统计方法的主要不同之处是进行统计推断时除了利用样本信息外,还要利用参数的先验信息,因此可以提高统计推断或统计决策的效果。它在经济、金融、生物、医学、自然科学和社会科学等许多领域具有广泛的应用。贝叶斯方法的研究已渗透到了统计学的几乎所有领域。作者在给中国科学技术大学概率论与数理统计专业本科生开设的“数理统计”课程中有一章专门讲授“贝叶斯方法和统计决策理论”,近十年来也给中国科学技术大学概率统计专业研究生开设过几次“贝叶斯分析”课。本书是在对过去讲稿的内容作了适当的增减和调整的基础上完成的。  本书共分六章。第1章是绪论,介绍了贝叶斯统计的若干基本概念,同时对必要的数理统计的基础知识有重点地作了回顾。第二章介绍了确定先验分布的若干可供选择的方法。第三章介绍了几类常见统计模型参数的后验分布的主要结果和计算方法。第四章和第五章分别介绍了“贝叶斯统计推断”和“贝叶斯统计决策”的内容。第六章介绍了贝叶斯统计计算的若干方法,包括蒙特卡洛方法和马尔可夫链蒙特卡洛(MCMC)方法以及相关统计软件的简介。本书的每一章附右大量的例题和习题,书末附有常用的几个表格和部分习题解答供读者查用。  大约可在54学时内讲授本书的第1章至第六章的主要内容,教师可根据学时需要选讲本书第1章至第六章的部分内容。书中标“*”号的章节可略去不讲,留给读者作为阅读材料。第六章例题中的R代码和部分例题的数据文件等可从作者个人主页下载。  作者在编写本书的过程中参考了J.O.Berger教授的《统计决策论及贝叶斯分析》和茆诗松教授编写的《贝叶斯统计》等书中的一些内容,以及《贝叶斯分析》一书中由张伟平博士编写的有关贝叶斯统计计算的一些内容。在此表示衷心感谢。  本书编写准备过程中,中国科学技术大学统计与金融系的几个研究生帮助完成了本书部分中文的录入和排版,作者对他们的辛勤工作表示真诚的感谢。高等教育出版社为本书的出版给予了大力支持。在此一并致谢。

上一篇: BLE设备省电秘籍:如何通过关闭杰理AC632N的EDR功能将休眠电流降到20uA
下一篇: Linux内核4.19中mutex_lock的性能优化技巧:从理论到实践
devops8pract
博客等级 码龄4年 533粉丝 849原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值