详解 Qt QtPDF之QPdfPageNavigator 页面跳转
文章目录
- 前言
- 头文件:
- 自 Qt 6.4 起
- 继承自:
- 属性
- `backAvailable : const bool`
- `currentLocation : const QPointF`
- `currentPage : const int`
- `currentZoom : const qreal`
- `forwardAvailable : const bool`
- 公共函数
- `QPdfPageNavigator(QObject *parent)`
- `virtual ~QPdfPageNavigator() override`
- `bool backAvailable() const`
- `QPointF currentLocation() const`
- `int currentPage() const`
- `qreal currentZoom() const`
- 公共槽函数
- `void back()`
- `void clear()`
- `void forward()`
- `void jump(int page, const QPointF &location, qreal zoom = 0)`
- `void jump(QPdfLink destination)`
- `void update(int page, const QPointF &location, qreal zoom)`
- 信号
- `void backAvailableChanged(bool available)`
- `void currentLocationChanged(QPointF location)`
- `void currentPageChanged(int page)`
- `void currentZoomChanged(qreal zoom)`
- `void forwardAvailableChanged(bool available)`
- `void jumped(QPdfLink current)`
- 示例代码
- 总结
前言
QPdfPageNavigator
类提供了在 PDF 文档中进行导航的功能,类似于网页浏览器中的“后退”和“前进”按钮。它允许用户在 PDF 文档中浏览页面,并记住页面的位置和缩放级别历史。此类可用于实现如后退、前进、跳转到文档中特定位置等功能。
头文件:
#include <QPdfPageNavigator>
自 Qt 6.4 起
继承自:
QObject
属性
backAvailable : const bool
此属性返回 true
,如果在导航历史中存在可以后退的目的地。这表示在调用 push()
或 forward()
后,用户可以向后导航到先前的页面和位置。
-
访问函数:
bool backAvailable() const
-
通知信号:
void backAvailableChanged(bool available)
currentLocation : const QPointF
此属性保存当前正在查看的页面的位置,它记录了最后一次传递给 jump()
或 update()
的位置。默认值为 (0, 0)
,表示页面的左上角。
-
访问函数:
QPointF currentLocation() const
-
通知信号:
void currentLocationChanged(QPointF location)
currentPage : const int
此属性保存当前正在查看的页面的索引,默认值为 0
,表示第一页。
-
访问函数:
int currentPage() const
-
通知信号:
void currentPageChanged(int page)
currentZoom : const qreal
此属性保存当前页面的缩放级别。值为 1
表示默认缩放级别,1 个逻辑像素等于 1 个点。默认值为 1
。
-
访问函数:
qreal currentZoom() const
-
通知信号:
void currentZoomChanged(qreal zoom)
forwardAvailable : const bool
此属性返回 true
,如果在导航历史中存在可以前进的目的地。这表示在调用 back()
后,用户可以向前导航到更近期的位置。
-
访问函数:
bool forwardAvailable() const
-
通知信号:
void forwardAvailableChanged(bool available)
公共函数
QPdfPageNavigator(QObject *parent)
构造函数,使用指定的父对象构建一个页面导航堆栈。此构造函数初始化导航器来跟踪页面、位置和缩放级别的历史记录。
virtual ~QPdfPageNavigator() override
析构函数,销毁页面导航堆栈,释放所有分配的资源。
bool backAvailable() const
返回 true
,如果在导航历史中存在后退的目的地,表示用户可以返回到先前的页面和位置。
QPointF currentLocation() const
返回当前查看页面的位置信息。这是最后一次调用 jump()
或 update()
时的位置。
int currentPage() const
返回当前查看的页面索引,表示用户当前所在的页面。
qreal currentZoom() const
返回当前页面的缩放级别,表示页面的缩放倍率。
公共槽函数
void back()
此槽函数从导航历史中弹出一个目的地,更新 currentPage
、currentLocation
和 currentZoom
属性为最近访问的目的地,然后发出 jumped()
信号。
void clear()
清除导航历史,并将 currentPage
、currentLocation
和 currentZoom
属性恢复为默认值。此操作相当于重置导航历史。
void forward()
此槽函数使视图返回到上次调用 back()
之前查看的页面、位置和缩放级别,并发出 jumped()
信号。如果自上次调用 back()
后有新的目的地被添加到历史中,forward()
将不会执行,因为这会在导航历史中创建一个分支,导致“未来”的目标丢失。
void jump(int page, const QPointF &location, qreal zoom = 0)
此槽函数将给定的目的地(由页面、位置和缩放级别组成)添加到导航历史中。如果未指定 zoom
参数或其值为 0
,则保留当前的缩放级别。此函数通常用于用户跳转到文档中的特定页面和位置,例如点击超链接或搜索结果。
void jump(QPdfLink destination)
此槽函数将指定的 QPdfLink
目的地添加到导航历史中。适用于跳转到超链接或搜索结果。QPdfLink
对象的 rectangles
属性用于定义应该在视口中显示的区域。
void update(int page, const QPointF &location, qreal zoom)
此函数用于更新当前目的地,包括页面、位置和缩放级别。通常在用户手动移动文档时调用,以便在调用 back()
后,forward()
会跳转到最后查看的目的地,而不是历史中最后一个指定的目的地。与 jump()
不同,调用 update()
不会触发 jumped()
信号,因为它表示平滑的滚动而不是跳转到新的位置。
信号
void backAvailableChanged(bool available)
当后退目的地的可用性发生变化时发出此信号,指示用户是否可以向后导航。
void currentLocationChanged(QPointF location)
当当前页面位置发生变化时发出此信号,指示用户跳转到新的位置或更新了当前位置。
void currentPageChanged(int page)
当当前页面发生变化时发出此信号,指示用户跳转到新的页面。
void currentZoomChanged(qreal zoom)
当页面的缩放级别发生变化时发出此信号,指示用户调整了缩放比例。
void forwardAvailableChanged(bool available)
当前进目的地的可用性发生变化时发出此信号,指示用户是否可以向前导航。
void jumped(QPdfLink current)
当用户跳转到新的目的地时(例如调用 back()
、forward()
、jump()
或 update()
),会发出此信号。此信号提供当前目的地的详细信息,包括页面、位置和缩放级别。
示例代码
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QPdfDocument>
#include <QPdfView>
#include <QVBoxLayout>
#include <QFileDialog>
#include <QPushButton>
#include <QLabel>
#include <QTreeView>
#include <QPdfBookmarkModel>
#include <QPdfPageNavigator>QT_BEGIN_NAMESPACE
namespace Ui {
class Widget;
}
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private:Ui::Widget *ui;
};class PdfViewer : public QWidget {Q_OBJECTpublic:PdfViewer(QWidget *parent = nullptr) : QWidget(parent) {// 创建布局管理器QVBoxLayout *layout = new QVBoxLayout(this);// 添加控件QLabel *label = new QLabel("请选择 PDF 文件:", this);QPushButton *loadButton = new QPushButton("加载 PDF", this);pdfView = new QPdfView(this);// 设置初始布局layout->addWidget(label);layout->addWidget(loadButton);layout->addWidget(pdfView);// 创建 PDF 文档对象pdfDocument = new QPdfDocument(this);// 创建 QPdfBookmarkModel,并将 pdfDocument 设置给它bookmarkModel = new QPdfBookmarkModel(this);// 创建 QTreeView 来显示书签QTreeView *bookmarkView = new QTreeView(this);bookmarkView->setModel(bookmarkModel); // 设置书签模型layout->addWidget(bookmarkView);// 连接按钮信号槽connect(loadButton, &QPushButton::clicked, this, &PdfViewer::loadPdf);QPushButton *next = new QPushButton("next",this);connect(next, &QPushButton::clicked, this, [=](){page++;navigator->jump(page,navigator->currentLocation());});setLayout(layout); // 设置主布局}private slots:void loadPdf() {// 打开文件选择对话框QString fileName = QFileDialog::getOpenFileName(this, "打开 PDF 文件", "", "PDF Files (*.pdf)");if (fileName.isEmpty()) return;// 加载 PDF 文档if (pdfDocument->load(fileName) == QPdfDocument::Error::None) {// 设置 pdfView 显示加载的文档pdfView->setDocument(pdfDocument);// 设置书签模型与文档bookmarkModel->setDocument(pdfDocument);// 您可以设置 pdfView 显示第一页navigator = pdfView->pageNavigator();} else {qWarning() << "无法加载 PDF 文件:" << fileName;}}private:QPdfDocument *pdfDocument; // PDF 文档对象QPdfView *pdfView; // PDF 视图组件QPdfBookmarkModel *bookmarkModel; // 书签模型QPdfPageNavigator* navigator;int page = 1;
};#endif // WIDGET_H
总结
QPdfPageNavigator
类用于记录用户在 PDF 文档中的浏览历史。它允许用户在文档中前后导航,并保持页面、位置和缩放级别的历史记录。此类特别适合实现 PDF 查看器中的后退、前进和跳转到特定位置等功能,类似于网页浏览器中的历史记录。
该类确保用户的浏览体验流畅,提供了返回先前位置或跳转到更近期位置的能力。QPdfPageNavigator
类通常与 QPdfView
一起使用,提供交互式的 PDF 查看体验。
此外,QPdfPageNavigator
还支持跳转到文档中的特定位置,诸如由链接或搜索结果标记的区域。缩放功能的加入使其成为构建丰富 PDF 查看应用程序的有力工具,支持详细的导航和探索。
总之,QPdfPageNavigator
通过管理导航历史,提供后退和前进控制,并保持 PDF 文档中的当前位置、缩放和页面数据,增强了用户体验。
相关文章:
详解 Qt QtPDF之QPdfPageNavigator 页面跳转
文章目录 前言头文件: 自 Qt 6.4 起继承自: 属性backAvailable : const boolcurrentLocation : const QPointFcurrentPage : const intcurrentZoom : const qrealforwardAvailable : const bool 公共函数QPdfPageNavigator(QObject *parent)virtual ~QPd…...
通俗易懂:序列标注与命名实体识别(NER)概述及标注方法解析
目录 一、序列标注(Sequence Tagging)二、命名实体识别(Named Entity Recognition,NER)**命名实体识别的作用****命名实体识别的常见实体类别** : 三、标签类型四、序列标注的三种常见方法1. **BIO…...
【C语言】二叉树(BinaryTree)的创建、3种递归遍历、3种非递归遍历、结点度的实现
代码主要实现了以下功能: 二叉树相关数据结构定义 定义了二叉树节点结构体 BiTNode,包含节点数据值(字符类型)以及指向左右子树的指针。 定义了顺序栈结构体 SqStack,用于存储二叉树节点指针,实现非递归遍历…...
2024年11月文章一览
2024年11月编程人总共更新了21篇文章: 1.2024年10月文章一览 2.《使用Gin框架构建分布式应用》阅读笔记:p307-p392 3.《使用Gin框架构建分布式应用》阅读笔记:p393-p437 4.《使用Gin框架构建分布式应用》读后感 5.《Django 5 By Example…...
重生之我在异世界学编程之C语言:二维数组篇
大家好,这里是小编的博客频道 小编的博客:就爱学编程 很高兴在CSDN这个大家庭与大家相识,希望能在这里与大家共同进步,共同收获更好的自己!!! 本文目录 引言正文一 二维数组的创建1. 二维数组的…...
和鲸科技创始人CEO范向伟出席首届工业智算产业发展研讨会,共话 AI 创新与产业化落地
11 月 22 日,首届工业智算产业发展研讨会在中国工业互联网研究院召开。工业和信息化部党组成员、副部长单忠德,国家信息中心大数据发展部副主任魏颖出席会议并致辞。中国工程院院士、北京化工大学教授高金吉,工业和信息化部信息通信发展司二级…...
postgres数据备份与主从配置
备份PostgreSQL数据库 备份格式有几种选择: bak:压缩二进制格式 sql:明文转储 tar: tarball mydb# \q -bash-4.2$ pg pgawk pg_dump pgrep pg_basebackup pg_dumpall pg_restore# 备份所有的 -bash-4.2$ pg_dumpall &…...
【二分查找】力扣 275. H 指数 II
一、题目 二、思路 h 指数是高引用引用次数,而 citations 数组中存储的就是不同论文被引用的次数,并且是按照升序排列的。也就是说 h 指数将整个 citations 数组分成了两部分,左半部分是不够引用 h 次 的论文,右半部分论文的引用…...
使用uni-app进行开发前准备
使用uni-app进行开发,需要遵循一定的步骤和流程。以下是一个详细的指南,帮助你开始使用uni-app进行开发: 一、开发环境搭建 安装Node.js: 首先,从Node.js的官方网站(https://nodejs.org/)下载并…...
AI开发-深度学习框架-PyTorch-torchnlp
1 需求 Welcome to Pytorch-NLP’s documentation! — PyTorch-NLP 0.5.0 documentation 2 接口 3 示例 4 参考资料...
VBA数据库解决方案第十七讲:Recordset对象记录位置的定位方法
《VBA数据库解决方案》教程(版权10090845)是我推出的第二套教程,目前已经是第二版修订了。这套教程定位于中级,是学完字典后的另一个专题讲解。数据库是数据处理的利器,教程中详细介绍了利用ADO连接ACCDB和EXCEL的方法…...
Ubuntu 操作系统
一、简介 Ubuntu 是一个基于 Linux 的开源操作系统,它由 Canonical Ltd. 公司维护和资助。Ubuntu 以其易用性、强大的社区支持和定期的安全更新而闻名,一个一桌面应用为主的操作系统。 二、用户使用 1、常规用户的登陆方式 在登录时一般使用普通用户&…...
Maven 内置绑定到底怎么回事?
Maven是一个很好的项目管理工具. 一方面有着众多脚手架,另一方面在依赖管理方面 帮助使用者做了很多准备工作. 随着Maven的使用和学习的深入,大家会不仅有一些问题。 比较浅显的一个就是, 日常我们的Maven 下载安装好以后,在IDE 里…...
如何把Qt exe文件发送给其他人使用
如何把Qt exe文件发送给其他人使用 1、先把 Debug改成Release2、重新构建项目3、运行项目4、找到release文件夹5、新建文件夹,存放exe文件6、打开qt控制台串口7、下载各种文件8、压缩,发送压缩包给别人 1、先把 Debug改成Release 2、重新构建项目 3、运行…...
【汇编语言】call 和 ret 指令(三) —— 深度解析汇编语言中的批量数据传递与寄存器冲突
文章目录 前言1. 批量数据的传递1.1 存在的问题1.2 如何解决这个问题1.3 示例演示1.3.1 问题说明1.3.2 程序实现 2. 寄存器冲突问题的引入2.1 问题引入2.2 分析与解决问题2.2.1 字符串定义方式2.2.2 分析子程序功能2.2.3 得到子程序代码 2.3 子程序的应用2.3.1 示例12.3.2 示例…...
定义函数合并字符串—超详细讲解
【问题描述】 编写一个函数void str_bin(char str1[ ], char str2[ ]), str1、str2是两个有序字符串(其中字符按ASCII码从小到大排序),将str2合并到字符串str1中,要求合并后的字符串仍是有序的,允许字符重…...
实现 vue3 正整数输入框组件
1.实现代码 components/InputInteger.vue <!-- 正整数输入框 --> <template><el-input v-model"_value" input"onInput" maxlength"9" clearable /> </template><script lang"ts" setup> import { ref …...
Leetcode - 周赛425
目录 一,3364. 最小正和子数组 二, 3365. 重排子字符串以形成目标字符串 三,3366. 最小数组和 四,3367. 移除边之后的权重最大和 一,3364. 最小正和子数组 本题可以直接暴力枚举,代码如下: …...
c++(斗罗大陆2)
我把魂力等级更新到了31级 #include<iostream> #include<conio.h> #include<windows.h> #include<stdlib.h> #include<stdio.h> #include<time.h> #include<string.h> using namespace std; int qs10; int xthl0;//先…...
redis常见数据类型
Redis是一个开源的、内存中的数据结构存储系统,它可以用作数据库、缓存和消息代理,支持多种数据类型。 一、数据类型介绍 String(字符串) Redis中最基本的数据类型。可以存储任何类型的数据,包括字符串、数字和二进制…...
MySQL - 性能优化
使用 Explain 进行分析 Explain 用来分析 SELECT 查询语句,开发人员可以通过分析 Explain 结果来优化查询语句。 比较重要的字段有: select_type : 查询类型,有简单查询、联合查询、子查询等 key : 使用的索引 rows : 扫描的行数 type :…...
Linux进程概念-详细版(一)
目录 进程概念 描述进程-PCB task_struct-PCB的一种 task_struct内容分类 查看进程 通过系统目录查看 通过ps命令查看 通过系统调用获取进程的PID和PPID 通过系统调用创建进程 fork的认识 使用if进行分流 最后的总结 Linux进程状态 运行状态-R 浅度睡眠状态-S 深度睡…...
K8S网络系列--Flannel网络下UDP、VXLAN模式的通信流程机制分析
文章目录 前言一、了解overlay、underlay容器网络二、网络通信1.分类2.网络虚拟设备对2.1、什么是网络虚拟设备对veth pair?2.2、如何查看容器的网卡与主机的哪个veth设备对是成对的关系? 3、vxlan和vtep3.1、vtep3.2、vxlan相关概念 三、Flannel网络模式剖析0、flannel的作用…...
ThreadLocal的设计思考
问题的提出 在Java多线程中,共享变量的读写非常容易出现不可预测的行为,因此对共享变量的访问控制非常重要。因此在多线程编程时,为了保证线程安全,需要进行额外的同步措施。比如典型的操作就是加锁。除了加锁外,另一…...
shell脚本练习(2)
1. 使用case实现成绩优良差的判断 2. for创建20用户 用户前缀由用户输入 用户初始密码由用户输入 例如:test01,test10 3. for ping测试指网段的主机 网段由用户输入,例如用户输入192.168.2 ,则ping 192.168.2.10 --- 192.168.2.2…...
通讯专题4.1——CAN通信之计算机网络与现场总线
从通讯专题4开始,来学习CAN总线的内容。 为了更好的学习CAN,先从计算机网络与现场总线开始了解。 1 计算机网络体系的结构 在我们生活当中,有许多的网络,如交通网(铁路、公路等)、通信网(电信、…...
Harmony NEXT-越过相机读写权限上传图片至项目云存储中
问题成因 在制作用户注册登录界面时想要实现用户头像上传共能,查询API文档,发现有picker和PhotoAccessHelper两个包可以选择使用,但是在使用PhotoAccessHelper包拉起相册并读入所选的照片后将该照片传入云存储中产生报错,需要相册…...
MATLAB基础应用精讲-【数模应用】Retinex图像去雾算法(附MATLAB和python代码实现)
目录 前言 算法原理 图像去雾 数学模型 算法步骤 算法拓展 多尺度Retinex (MSR) 算法 MSR算法的实现细节 McCann Retinex 算法 McCann99 Retinex算法 基于暗通道先验的图像去雾算法 暴力解法——直方图均衡化去雾 基于Retinex理论的图像去雾 基于暗通道先验的单…...
点击A组件跳转到B页面的tab的某一列
1、使用vuex存储点击的数据; 点击A组件里面的button按钮: <div><button click"banli(first)">已办理</button><button click"banli(second)">未办理</button><button click"banli(third)&quo…...
HarmonyOS xml转换JavaScript 常用的几个方法
HarmonyOS 使用 xml转换JavaScript 的好处 易用性: 提供了简洁的API接口,使得XML到JavaScript对象的转换变得简单直接。转换选项的灵活性允许开发者根据实际需求自定义转换结果。 高效性: HarmonyOS对底层运行时环境进行了优化,使…...
做二手网站赚钱不/5151app是交友软件么
前言 本文我们来对Lucene具体如何进行数据的搜索,进行详细的介绍。 环境准备 我们直接使用在上一篇文章中的应用代码案例。 因为索引和存储两者是分开的,对于某一个字段我们可以建立索引,但是不存储,我们依然可以对此字段进行…...
一万元做网站/免费seo优化
级数 01 求级数的和函数 调用格式为: fn为级数的通项,k为级数项数,k0与kn为级数的开始项和终止项。 (fn需要以符号表达式给出,若fn只有一个自变量,则k可以省略。)Ssymsum(fn,k,k0,kn)实践 求…...
网站建设存在的问题及解决办法/北京seo外包 靠谱
前言:我的项目是SpringBootMaven,所以我直接在IDEA用Maven打包了我的项目,名称为demo.jar。我需要把这个jar包放到Linux服务器并启动,而且本机可以访问到该项目一,启动停止项目二,开启访问端口正文…...
做网站公众号多少钱/微信管理
十九个模块: Java 基础、容器、多线程、反射、对象拷贝、Java Web 模块、异常、网络、设计模式、Spring/Spring MVC、Spring Boot/Spring Cloud、Hibernate、Mybatis、RabbitMQ、Kafka、Zookeeper、MySql、Redis、JVM 。 一、Java 基础 1.JDK 和 JRE 有什么区别&a…...
义乌seo快速排名/seo页面排名优化
大家应该看过很多分享面试成功的经验,但根据幸存者偏差的理论,也许多看看别人面试失败在哪里,对自己才更有帮助。 最近跟一个朋友聊天,他准备了几个月,刚刚参加完字节跳动面试,第二面结束后,嗯&…...
美女做直播网站有哪些/关键词数据分析工具有哪些
Apache Kafka是一个高性能、高可用性、冗余的流消息平台。Kafka的功能很像发布/订阅消息系统,但具有更高的吞吐量、内置分区、复制和容错能力。对于大规模消息处理应用程序来说,Kafka是一个很好的解决方案。它通常与Apache Hadoop和Spark Streaming一起使…...