终极暗黑破坏神2现代化改造:d2dx宽屏补丁让你的经典游戏焕然一新
2026/5/6 0:56:34
Qt 6 引入了一个原生、跨平台的模块来处理 PDF 文档,大大简化了在应用程序中显示和操作 PDF 文件的需求。
QtPdf和QtPdfWidgetsQt 6 的 PDF 功能主要通过两个模块提供:
QtPdf:
QQuickPdfRenderer类,允许在 Qt Quick (QML) 场景中异步渲染 PDF 页面到图像(如QImage或QPixmap)。QPdfDocument类是这个模块的核心,它代表一个加载的 PDF 文档。你可以获取文档信息(标题、作者、页数等)、加载密码保护的文档、访问页面内容等。QtPdfWidgets(可选):
QPdfView和QPdfPageView类,用于在传统的 Widgets 应用程序中轻松显示 PDF 文档。这些视图处理了渲染、缩放、导航等常见功能。QPdfSearchBar类,可以方便地集成到QPdfView中,为用户提供文本搜索功能。Qt 的 PDF 模块是基于 Google 的 PDFium 库构建的。PDFium 是一个开源、轻量级、功能强大的 PDF 渲染器和解析器库。Qt 在其基础上提供了一个更符合 Qt 开发习惯和 API 设计风格的封装层。
加载 PDF 文档:
QPdfDocument类。QPdfDocument*doc=newQPdfDocument(this);doc->load("path/to/document.pdf");// 同步加载// 或者doc->loadAsync("path/to/document.pdf");// 异步加载doc->load("encrypted.pdf","password");status()属性(枚举QPdfDocument::Status)和statusChanged()信号通知。获取文档信息:
intpageCount=doc->pageCount();QString title=doc->metaData(QPdfDocument::MetaDataField::Title);QString author=doc->metaData(QPdfDocument::MetaDataField::Author);渲染 PDF 页面:
QtPdf(QML/通用):QQuickPdfRenderer。import QtPdf PdfDocument { id: pdfDoc source: "doc.pdf" } Image { source: PdfImageRenderer { document: pdfDoc page: 0 // 页码 resolution: 144 // DPI } }QPdfDocument::render方法渲染到QImage:QImage image=doc->render(pageIndex,size,QPdfDocument::RenderFlag::Annotations);QtPdfWidgets(Widgets):QPdfView:QPdfView*pdfView=newQPdfView(this);pdfView->setDocument(doc);页面导航:
QPdfDocument::pageCount()和当前页码(通常由视图控件管理)实现。QPdfView提供了内置的导航控件(上一页/下一页/跳转)。缩放:
QPdfView支持鼠标滚轮缩放、手势缩放(触摸屏)以及通过 API (zoomIn(),zoomOut(),resetZoom()) 控制。zoomFactor()属性访问。文本搜索:
QPdfDocument::search()方法进行异步搜索。searchFinished()信号返回,包含匹配的位置(页码和边界矩形)。QPdfView可以高亮显示搜索结果。QPdfSearchBar提供了搜索 UI。获取页面内容:
QString pageText=doc->page(pageIndex).text();QSizeF pageSize=doc->pageSize(pageIndex);批注和表单(高级):
QPdfDocument::render的RenderFlags参数可以控制是否渲染注释。QPdfView可能提供一些基本的表单交互功能(具体取决于 Qt 版本)。链接导航:
QPdfView通常能识别这些链接,用户点击后可以触发导航(跳转到指定页面)或发出信号(如linkActivated)让应用程序处理外部链接。QT_ANDROID_PDF_PROVIDER环境变量设置为"pdfium"(或在android/src/.../QtActivity.java中设置)。QQuickPdfRenderer或loadAsync) 避免阻塞 UI 线程。考虑只渲染当前可见的页面区域。QPdfDocument和渲染资源,尤其是在移动设备上。QtPdf和QtPdfWidgets模块需要正确配置和链接到项目中。PdfDocument和PdfImageRenderer提供了声明式接口。注意资源释放,可以使用Component.onDestruction或Connections监听文档卸载。import QtQuick import QtQuick.Controls import QtPdf ApplicationWindow { visible: true width: 800 height: 600 PdfDocument { id: pdfDoc source: Qt.resolvedUrl("sample.pdf") } ScrollView { anchors.fill: parent Column { Repeater { model: pdfDoc.pageCount Image { source: PdfImageRenderer { document: pdfDoc page: index resolution: 96 // 根据需要调整 DPI } width: parent.width // 宽度适应视图 height: width * (pdfDoc.pageSize(index).height / pdfDoc.pageSize(index).width) // 保持宽高比 } } } } }#include<QApplication>#include<QPdfDocument>#include<QPdfView>intmain(intargc,char*argv[]){QApplicationapp(argc,argv);QPdfDocument*doc=newQPdfDocument();doc->load("sample.pdf");QPdfView*view=newQPdfView();view->setDocument(doc);view->show();returnapp.exec();}Qt 6 的 PDF 模块 (QtPdf和QtPdfWidgets) 提供了一个强大且相对易用的原生解决方案,用于在 Qt 应用程序中集成 PDF 功能。它涵盖了加载、渲染、导航、缩放、搜索等核心需求,并具有良好的跨平台支持。开发者可以根据应用场景选择使用底层的QPdfDocumentAPI 进行精细控制,或者利用方便的QPdfView/ QML 组件快速实现 PDF 查看器功能。
下面是一个生成PDF的示例
#include"mainwindow.h"#include"ui_mainwindow.h"#include<QPdfWriter>#include<QPainter>#include<QTextDocument>MainWindow::MainWindow(QWidget*parent):QMainWindow(parent),ui(newUi::MainWindow){ui->setupUi(this);}MainWindow::~MainWindow(){deleteui;}voidMainWindow::on_pushButton_clicked(){// 初始化 PDF 写入器,指定输出文件名QPdfWriterwriter("output.pdf");writer.setPageSize(QPageSize::A4);// 设置页面大小writer.setTitle("由 Qt 生成的 PDF 示例");// 设置文档标题writer.setCreator("我的 Qt 应用");// 设置创建者// 初始化画家,并指定在 QPdfWriter 上绘制QPainterpainter(&writer);painter.setRenderHint(QPainter::Antialiasing);// 开启抗锯齿,让图形和文字更平滑// 1. 使用 QPainter 直接绘制简单图形和文本painter.drawText(100,100,"你好,这是由 QPdfWriter 生成的 PDF!");// 在指定坐标绘制文本painter.drawRect(50,150,200,100);// 绘制矩形// 2. 使用 QTextDocument 处理富文本和复杂格式QTextDocument textDoc;textDoc.setHtml("<h1>这是一个标题</h1>""<p>这是一个<strong>加粗</strong>和<em>斜体</em>的段落。</p>""<ul><li>列表项一</li><li>列表项二</li></ul>");// 将 QTextDocument 的内容绘制到 PDF 的指定区域textDoc.drawContents(&painter,QRectF(50,300,500,500));// 结束绘制,确保所有内容已写入文件painter.end();}