(十八)QT跨版本PDF生成:从QPrinter到QPdfWriter的迁移与实战

1. Qt PDF生成技术演进:从QPrinter到QPdfWriter

在Qt4时代,开发者使用QPrinter类来生成PDF文件,这个设计初衷是为了打印而存在的类,意外地成为了当时PDF生成的主要工具。我记得第一次用QPrinter生成PDF时,感觉就像是用螺丝刀当锤子使 - 虽然能用,但总感觉不太对劲。

随着Qt5的发布,Qt团队引入了专门用于PDF生成的QPdfWriter类。这个变化不仅仅是简单的类名替换,而是整个设计理念的升级。QPdfWriter去掉了打印相关的冗余功能,专注于PDF生成,使得API更加简洁高效。

在实际项目中,我遇到过这样一个典型场景:一个医疗报告系统需要将患者检查结果输出为PDF。在Qt4环境下,我们不得不处理各种打印相关的参数,比如纸张来源、双面打印等完全用不到的功能。迁移到Qt5后,代码量减少了近30%,性能提升了约40%,这充分证明了专用工具的价值。

2. 跨版本迁移实战指南

2.1 模块配置差异

从Qt4迁移到Qt5/6时,第一个要注意的就是模块系统的变化。在Qt4中,QPrinter是QtGui模块的一部分,而在Qt5中,所有打印相关类都被移到了Qt Print Support模块。

我踩过的一个坑是:在.pro文件中忘记添加printsupport模块,结果编译时报了一堆莫名其妙的错误。正确的配置应该是:

QT += printsupport  # 必须添加这行

在代码中包含头文件时也要注意变化:

// Qt4风格(已过时)
#include <QPrinter>

// Qt5/6正确方式
#include <QtPrintSupport/QPrinter>
#include <QtPrintSupport/QPdfWriter>

2.2 API使用对比

让我们通过一个实际例子看看两种方式的区别。假设我们要生成一个简单的文本PDF:

Qt4 QPrinter方式

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

QPainter painter(&printer);
painter.drawText(100, 100, "Hello Qt4 PDF");
painter.end();

Qt5 QPdfWriter方式 </

「LLM那些事」系列第 4 篇《上下文窗口的边界》,文章连接:https://blog.csdn.net/houwenjin/article/details/163999753。 演示什么:在「预测」Sheet 的黄色格子里输入一句话(默认「来泡一杯」),四个「模型」——分别只统计最后 1 / 2 / 3 / 4 个字的 n-gram 查表——同时预测下一个字。同一个输入,看的上下文越长,候选越少、预测越确定: ┌────────────────┬──────────┬───────────────┬──────┐ │ 只看最后几个字 │ 用的前缀 │ 候选下一字数 │ 预测 │ ├────────────────┼──────────┼───────────────┼──────┤ │ 1 个 │ 杯 │ 3(茶/子/水) │ 模糊 │ ├────────────────┼──────────┼───────────────┼──────┤ │ 2 个 │ 一杯 │ 2(茶/水) │ 收窄 │ ├────────────────┼──────────┼───────────────┼──────┤ │ 3 个 │ 泡一杯 │ 1(茶) │ 确定 │ ├────────────────┼──────────┼───────────────┼──────┤ │ 4 个 │ 来泡一杯 │ 1(茶) │ 确定 │ └────────────────┴──────────┴───────────────┴──────┘
源码下载地址: https://pan.quark.cn/s/a4b39357ea24 笔记本的散热风扇管理 ---------------------------------------- 09 November 2006. 对于版本20061109的变更概述如下: 1) ACPI CA核心子系统:在源操作数是一个操作区域的场景下,对负载ASL操作符进行了优化。仅需映射操作区域内存,而不是执行逐字节读取。 (区域必须为SystemMemory类型,见下文。)修正了源操作数为区域字段的负载ASL操作符问题。也允许缓冲区对象作为源操作数。 BZ 480 解决了负载ASL操作符允许源操作数为任意类型操作区域的问题。现被限制为仅SystemMemory类型的区域,符合ACPI规范。 BZ 481 对新表管理器代码进行了额外的清理和优化。AcpiEnable将在所有必需的ACPI表未加载时失败(FADT, FACS, DSDT)。 BZ 477 在acobject.h中添加了#pragma pack(8/4),以确保此头文件中的结构始终编译为对齐。ACPI_OPERAND_OBJECT已被手动优化为对齐,并在字节打包时无法工作。示例代码和数据大小:这些是Microsoft Visual C++ 6.0 32位编译器生成的、操作系统无关的acpica.lib的大小。调试版本的代码包含调试输出跟踪机制,具有更大的代码和数据大小。上一个版本:非调试版本:78.1K代码,17.1K数据,95.2K总计 调试版本:155.4K代码,63.1K数据,218.5K总计 当前版本:非调试版本:77.9K代码,17.0K数据,94.9K总计 调试版本:155.2K代码,63.1K数据,...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值