详解 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中最基本的数据类型。可以存储任何类型的数据,包括字符串、数字和二进制…...
铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...
地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...
C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...
CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...
大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...
