qt pdf 模块简介

news2024/11/25 20:36:59

文章目录

  • 1. 技术平台
  • 2. Qt pdf 模块
  • 3. cmake 使用模块
  • 4. 许可证
  • 5. 简单示例
    • 5.1 CMakeLists.txt
    • 5.2 main.cpp
  • 6. 总结

1. 技术平台

项目说明
OSwin10 x64
Qt6.6
compilermsvc2022
构建工具cmake

2. Qt pdf 模块

  Qt PDF模块包含用于呈现PDF文档的类和函数。

  • QPdfDocument 类加载PDF文档,并根据QPdfDocumentRenderOptions类提供的选项从中呈现页面。
  • QPdfPageRenderer 类管理一个队列,该队列收集所有呈现请求。
  • QPdfPageNavigator 类处理通过PDF文档的导航。
  • QPdfSearchModel 类搜索字符串并保存搜索结果。
  • QPdfBookmarkModel 类保存目录(如果存在)。
  • QPdfLinkModel 保存有关页面上超链接的信息。
  • QPdfView 小部件是一个完整的PDF查看器,< PDF Viewer Widget Example> 示例展示了如何使用它。

Qt Quick 部分略过不提

  如果只需要呈现页面图像,而不需要文本选择、搜索和导航等功能,则该模块包含一个QImageIOHandler插件,该插件将PDF视为可伸缩的图像格式,类似于SVG。您可以简单地使用Image,并将currentFrame属性设置为希望显示的页面索引。如果PDF文件不呈现其自己的背景,则图像具有透明背景。

3. cmake 使用模块

 find_package(Qt6 REQUIRED COMPONENTS Pdf PdfWidgets)
 target_link_libraries(mytarget Qt6::Pdf Qt6::PdfWidgets)

4. 许可证

Qt PDF在Qt公司的商业许可下可用。此外,它在GNU较宽松通用公共许可证(版本3)或GNU通用公共许可证(版本2)下可用。有关此模块的更多详细信息,请参阅Qt PDF许可。

5. 简单示例

在这里插入图片描述

5.1 CMakeLists.txt

#CMakeLists.txt
	
cmake_minimum_required(VERSION 3.5)

project(QtPDF VERSION 0.1 LANGUAGES CXX)

set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Widgets  PdfWidgets Pdf)
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Widgets  PdfWidgets Pdf)

set(PROJECT_SOURCES
        main.cpp
)

if(${QT_VERSION_MAJOR} GREATER_EQUAL 6)
    qt_add_executable(QtPDF
        MANUAL_FINALIZATION
        ${PROJECT_SOURCES}
    )
# Define target properties for Android with Qt 6 as:
#    set_property(TARGET QtPDF APPEND PROPERTY QT_ANDROID_PACKAGE_SOURCE_DIR
#                 ${CMAKE_CURRENT_SOURCE_DIR}/android)
# For more information, see https://doc.qt.io/qt-6/qt-add-executable.html#target-creation
else()
    if(ANDROID)
        add_library(QtPDF SHARED
            ${PROJECT_SOURCES}
        )
# Define properties for Android with Qt 5 after find_package() calls as:
#    set(ANDROID_PACKAGE_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/android")
    else()
        add_executable(QtPDF
            ${PROJECT_SOURCES}
        )
    endif()
endif()

target_link_libraries(QtPDF PRIVATE
  Qt${QT_VERSION_MAJOR}::Widgets
  Qt${QT_VERSION_MAJOR}::PdfWidgets
  Qt${QT_VERSION_MAJOR}::Pdf
)

# Qt for iOS sets MACOSX_BUNDLE_GUI_IDENTIFIER automatically since Qt 6.1.
# If you are developing for iOS or macOS you should consider setting an
# explicit, fixed bundle identifier manually though.
if(${QT_VERSION} VERSION_LESS 6.1.0)
  set(BUNDLE_ID_OPTION MACOSX_BUNDLE_GUI_IDENTIFIER com.example.QtPDF)
endif()
set_target_properties(QtPDF PROPERTIES
    ${BUNDLE_ID_OPTION}
    MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION}
    MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}
    MACOSX_BUNDLE TRUE
    WIN32_EXECUTABLE TRUE
)

include(GNUInstallDirs)
install(TARGETS QtPDF
    BUNDLE DESTINATION .
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)

if(QT_VERSION_MAJOR EQUAL 6)
    qt_finalize_executable(QtPDF)
endif()

5.2 main.cpp

#include <QtWidgets>
#include <QtPdfWidgets>
#include "qout.hpp"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QMainWindow w;

    // 分割器
    auto splitter  = new QSplitter(&w);
    w.setCentralWidget(splitter);

    // PDF查看器控件
    auto *pdf_view = new QPdfView(splitter);
    pdf_view->setPageMode(QPdfView::PageMode::MultiPage); // 多页浏览模式
    pdf_view->setZoomMode(QPdfView::ZoomMode::FitToWidth);// 适合宽度模式

    // QPdfDocument类 加载PDF文档并呈现页面
    auto pdf_doc = new QPdfDocument(pdf_view);
    pdf_view->setDocument(pdf_doc);

    pdf_doc->load("E:/00_Download/Compressed/现代 C   教程:高速上手 C  11_14_17_20.pdf");

    // QPdfBookmarkModel类 保存PDF文档中的链接树(锚点),例如目录。
    QPdfBookmarkModel *pdfBookmarkModel = new QPdfBookmarkModel(splitter);
    pdfBookmarkModel->setDocument(pdf_doc);

    // 使用TreeView 来显示目录
    auto bookMarkTreeView = new  QTreeView(splitter);
    QFont serifFont("Times", 10, QFont::Normal);
    bookMarkTreeView->setModel(pdfBookmarkModel);
    bookMarkTreeView->setFont(serifFont);
    bookMarkTreeView->header()->hide();

    splitter->addWidget(bookMarkTreeView);
    splitter->addWidget(pdf_view);
    splitter->setStretchFactor(1,1); // pdf_view 获取最大的可用空间

    w.showMaximized();

    // 打印书签的角色名称
    qout << pdfBookmarkModel->roleNames();
    qout << pdfBookmarkModel->rowCount() << pdfBookmarkModel->columnCount();


    auto index = pdfBookmarkModel->index(0,0);
    qout << index;

    qout << pdfBookmarkModel->data(index,(int)QPdfBookmarkModel::Role::Title);
    qout << pdfBookmarkModel->data(index,(int)QPdfBookmarkModel::Role::Level);
    qout << pdfBookmarkModel->data(index,(int)QPdfBookmarkModel::Role::Page);
    qout << pdfBookmarkModel->data(index,(int)QPdfBookmarkModel::Role::Location);
    qout << pdfBookmarkModel->data(index,(int)QPdfBookmarkModel::Role::Zoom);

    QObject::connect(bookMarkTreeView,&QTreeView::clicked,bookMarkTreeView,[pdf_view,pdfBookmarkModel](const QModelIndex &index){
        QPdfPageNavigator* nav = pdf_view->pageNavigator();
        auto page = pdfBookmarkModel->data(index,(int)QPdfBookmarkModel::Role::Page).toInt();
        nav->jump(page, {}, nav->currentZoom());
    });

    return a.exec();
}

6. 总结

Qt pdf 模块 底层使用的是PDFium库, 不知道是不是PDFium库的版本问题,在解析书签目录的时候,还是有点问题, 没有location,所以没必要深究这个模块,不是太理想

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1255387.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python基础:字符串详解(需补充完善)

1. 字符串定义 在Python中&#xff0c;字符串是一种数据类型&#xff0c;用于表示文本数据。字符串是由字符组成的序列&#xff0c;可以包含字母、数字、符号和空格等字符。在Python中&#xff0c;你可以使用单引号&#xff08;&#xff09;或双引号&#xff08;"&#x…

SpringBoot 拦截器高级篇

Springboot 拦截器 定义使用场景拦截器与过滤器的区别实现步骤全局拦截器的局限性全局拦截器VS局部拦截器局部拦截器自定义局部拦截器使用多个局部拦截器 定义 拦截器是Spring MVC框架中的一个重要组件&#xff0c;它是一种AOP&#xff08;面向切面编程&#xff09;的实现方式&…

汽车租聘管理与推荐系统Python+Django网页界面+协同过滤推荐算法

一、介绍 汽车租聘管理与推荐系统。本系统使用Python作为主要编程语言&#xff0c;前端采用HTML、CSS、BootStrap等技术搭建前端界面&#xff0c;后端采用Django框架处理用户的请求。创新点&#xff1a;使用协同过滤推荐算法实现对当前用户个性化推荐。 其主要功能如下&#x…

lua的gc原理

lua垃圾回收(Garbage Collect)是lua中一个比较重要的部分。由于lua源码版本变迁&#xff0c;目前大多数有关这个方面的文章都还是基于lua5.1版本&#xff0c;有一定的滞后性。因此本文通过参考当前的5.3.4版本的Lua源码&#xff0c;希望对Lua的GC算法有一个较为详尽的探讨。 L…

4.前端--HTML标签-表格列表表单【2023.11.25】

1.表格 1.1表格的作用 表格的作用&#xff1a;表格主要用于显示、展示数据 1.2表格的基本格式 <table><tr><td>单元格内的文字</td><td>单元格内的文字</td>...</tr>... </table><table> </table> 是用于定义表…

【C++】类和对象——拷贝构造和赋值运算符重载

上一篇我们讲了构造函数&#xff0c;就是对象实例化时会自动调用&#xff0c;那么&#xff0c;我们这里的拷贝构造在形式上是构造函数的一个重载&#xff0c;拷贝构造其实也是一种构造函数&#xff0c;那么我们就可以引出这里的规则 1.拷贝构造函数的函数名必须与类名相同。 2.…

vue3+tsx的使用

<template><div><xiaoman on-click"getItem" name"似懂非懂"></xiaoman></div> </template><script setup langts>import xiaoman from "./App"const getItem(item:any)>{console.log(item,it…

Java多线程二-线程安全

1、线程安全问题 多个线程&#xff0c;同时操作同一个共享资源的时候&#xff0c;可能会出现业务安全问题。 2、实例&#xff1a;取钱的线程安全问题 2.1、场景 小明和小红是夫妻&#xff0c;他们有个共同账户&#xff0c;余额是十万元&#xff0c;如果两人同时取钱并且各自取…

Bytebase 2.11.1 - 数据脱敏支持语义类型和脱敏算法

&#x1f680; 新功能 数据脱敏支持自定义脱敏算法和语义类型。 &#x1f514; 重大变更 用户页面的 URL 由 /u/{uid} 变更为 /users/{email}。工作空间的所有者和开发者分别更名为&#xff1a;管理员和成员。 &#x1f384; 改进 SQL 编辑器支持显示表的 DDL 语句&#…

【Unity基础】8.简单场景的搭建

【Unity基础】8.简单场景的搭建 大家好&#xff0c;我是Lampard~~ 欢迎来到Unity基础系列博客&#xff0c;所学知识来自B站阿发老师~感谢 &#xff08;一&#xff09;场景资源 &#xff08;1&#xff09;Import资源包 今天我们将手动去搭一个简单的场景&#xff0c;当…

HONOR荣耀MagicBook 15 2021款 锐龙版R5(BMH-WFQ9HN)原厂Windows11预装OEM系统含F10智能还原

链接&#xff1a;https://pan.baidu.com/s/1faYtC5BIDC2lsV_JSMI96A?pwdj302 提取码&#xff1a;j302 原厂系统Windows11.22H2工厂模式安装包,含F10一键智能还原&#xff0c;自带所有驱动、出厂主题壁纸、系统属性专属LOGO标志、Office办公软件、荣耀 电脑管家等预装程序 …

SQL JOIN 子句:合并多个表中相关行的完整指南

SQL JOIN JOIN子句用于基于它们之间的相关列合并来自两个或更多表的行。 让我们看一下“Orders”表的一部分选择&#xff1a; OrderIDCustomerIDOrderDate1030821996-09-1810309371996-09-1910310771996-09-20 然后&#xff0c;看一下“Customers”表的一部分选择&#xff…

thinkphp最新开发的物业管理系统 缴费管理、停车管理、收费管理、值班管理

物业费&#xff0c;水电燃气费&#xff0c;电梯费&#xff0c;租金&#xff0c;临时收费等多种收费规则完全自定义&#xff0c;账单自动生成&#xff0c;无需人工计算 实时数据互通&#xff1a;一键报事报修&#xff0c;购买车辆月卡&#xff0c;管理家人信息&#xff0c;参加物…

java根据时间区间计算区间中都包含那几个月

在一些需要统计类的需求中可能会计算同比/环比数据,往往我们拿到的并不是每个月的准确时间,需要自行计算,一点一点计算还是挺麻烦的,因此搞一个工具类出来 工具类 public static void main(String[] args) {//为了准确,这里使用的时间毫秒值long beginTime 1577836800000L;…

从0到1建立前端规范

本文适合打算建立前端规范的小伙伴阅读 一、为什么需要规范 规范能给我们带来什么好处&#xff0c;如果没有规范会造成什么后果&#xff1f;这里主要拿代码规范来说。 统一代码规范的好处&#xff1a; 提高代码整体的可读性、可维护性、可复用性、可移植性和可靠性&#xf…

Java制作“简易王者荣耀”小游戏

第一步是创建项目 项目名自拟 第二部创建个包名 来规范class 然后是创建类 GameFrame 运行类 package com.sxt;import java.awt.Graphics; import java.awt.Image; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; im…

圆通速递单号查询入口,以表格的形式导出详细物流信息

批量查询圆通速递单号的物流信息&#xff0c;并以表格的形式导出单号的详细物流信息。 所需工具&#xff1a; 一个【快递批量查询高手】软件 圆通速递单号若干 操作步骤&#xff1a; 步骤1&#xff1a;运行【快递批量查询高手】软件&#xff0c;第一次使用的伙伴记得先注册&…

灯塔的安装

Docker 安装 docker 安装参考&#xff1a;https://docs.docker.com/engine/install/ shell脚本: curl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.sh灯塔安装 mkdir docker-ARL;cd docker-ARL curl https://bootstrap.pypa.io/get-pip.py -o get-pip…

如何在Ubuntu系统上安装Node.js

简单介绍 简单的说Node.js就是运行在服务端的JavaScript。Node.js是一个基于Chrome JavaScript运行时建立的一个平台。Node.js是一个事件驱动I/O服务端JavaScript 环境&#xff0c;基于Google的V8引擎&#xff0c;V8引擎执行Javascript的速度非常快&#xff0c;性能非常好。 no…

【Hadoop】分布式文件系统 HDFS

目录 一、介绍二、HDFS设计原理2.1 HDFS 架构2.2 数据复制复制的实现原理 三、HDFS的特点四、图解HDFS存储原理1. 写过程2. 读过程3. HDFS故障类型和其检测方法故障类型和其检测方法读写故障的处理DataNode 故障处理副本布局策略 一、介绍 HDFS &#xff08;Hadoop Distribute…