当前位置: 首页 > news >正文

详解 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()

此槽函数从导航历史中弹出一个目的地,更新 currentPagecurrentLocationcurrentZoom 属性为最近访问的目的地,然后发出 jumped() 信号。

void clear()

清除导航历史,并将 currentPagecurrentLocationcurrentZoom 属性恢复为默认值。此操作相当于重置导航历史。

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 页面跳转

文章目录 前言头文件&#xff1a; 自 Qt 6.4 起继承自&#xff1a; 属性backAvailable : const boolcurrentLocation : const QPointFcurrentPage : const intcurrentZoom : const qrealforwardAvailable : const bool 公共函数QPdfPageNavigator(QObject *parent)virtual ~QPd…...

通俗易懂:序列标注与命名实体识别(NER)概述及标注方法解析

目录 一、序列标注&#xff08;Sequence Tagging&#xff09;二、命名实体识别&#xff08;Named Entity Recognition&#xff0c;NER&#xff09;**命名实体识别的作用****命名实体识别的常见实体类别** &#xff1a; 三、标签类型四、序列标注的三种常见方法1. **BIO&#xf…...

【C语言】二叉树(BinaryTree)的创建、3种递归遍历、3种非递归遍历、结点度的实现

代码主要实现了以下功能&#xff1a; 二叉树相关数据结构定义 定义了二叉树节点结构体 BiTNode&#xff0c;包含节点数据值&#xff08;字符类型&#xff09;以及指向左右子树的指针。 定义了顺序栈结构体 SqStack&#xff0c;用于存储二叉树节点指针&#xff0c;实现非递归遍历…...

2024年11月文章一览

2024年11月编程人总共更新了21篇文章&#xff1a; 1.2024年10月文章一览 2.《使用Gin框架构建分布式应用》阅读笔记&#xff1a;p307-p392 3.《使用Gin框架构建分布式应用》阅读笔记&#xff1a;p393-p437 4.《使用Gin框架构建分布式应用》读后感 5.《Django 5 By Example…...

重生之我在异世界学编程之C语言:二维数组篇

大家好&#xff0c;这里是小编的博客频道 小编的博客&#xff1a;就爱学编程 很高兴在CSDN这个大家庭与大家相识&#xff0c;希望能在这里与大家共同进步&#xff0c;共同收获更好的自己&#xff01;&#xff01;&#xff01; 本文目录 引言正文一 二维数组的创建1. 二维数组的…...

和鲸科技创始人CEO范向伟出席首届工业智算产业发展研讨会,共话 AI 创新与产业化落地

11 月 22 日&#xff0c;首届工业智算产业发展研讨会在中国工业互联网研究院召开。工业和信息化部党组成员、副部长单忠德&#xff0c;国家信息中心大数据发展部副主任魏颖出席会议并致辞。中国工程院院士、北京化工大学教授高金吉&#xff0c;工业和信息化部信息通信发展司二级…...

postgres数据备份与主从配置

备份PostgreSQL数据库 备份格式有几种选择&#xff1a; bak&#xff1a;压缩二进制格式 sql&#xff1a;明文转储 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 指数是高引用引用次数&#xff0c;而 citations 数组中存储的就是不同论文被引用的次数&#xff0c;并且是按照升序排列的。也就是说 h 指数将整个 citations 数组分成了两部分&#xff0c;左半部分是不够引用 h 次 的论文&#xff0c;右半部分论文的引用…...

使用uni-app进行开发前准备

使用uni-app进行开发&#xff0c;需要遵循一定的步骤和流程。以下是一个详细的指南&#xff0c;帮助你开始使用uni-app进行开发&#xff1a; 一、开发环境搭建 安装Node.js&#xff1a; 首先&#xff0c;从Node.js的官方网站&#xff08;https://nodejs.org/&#xff09;下载并…...

AI开发-深度学习框架-PyTorch-torchnlp

1 需求 Welcome to Pytorch-NLP’s documentation! — PyTorch-NLP 0.5.0 documentation 2 接口 3 示例 4 参考资料...

VBA数据库解决方案第十七讲:Recordset对象记录位置的定位方法

《VBA数据库解决方案》教程&#xff08;版权10090845&#xff09;是我推出的第二套教程&#xff0c;目前已经是第二版修订了。这套教程定位于中级&#xff0c;是学完字典后的另一个专题讲解。数据库是数据处理的利器&#xff0c;教程中详细介绍了利用ADO连接ACCDB和EXCEL的方法…...

Ubuntu 操作系统

一、简介 Ubuntu 是一个基于 Linux 的开源操作系统&#xff0c;它由 Canonical Ltd. 公司维护和资助。Ubuntu 以其易用性、强大的社区支持和定期的安全更新而闻名&#xff0c;一个一桌面应用为主的操作系统。 二、用户使用 1、常规用户的登陆方式 在登录时一般使用普通用户&…...

Maven 内置绑定到底怎么回事?

Maven是一个很好的项目管理工具. 一方面有着众多脚手架&#xff0c;另一方面在依赖管理方面 帮助使用者做了很多准备工作. 随着Maven的使用和学习的深入&#xff0c;大家会不仅有一些问题。 比较浅显的一个就是&#xff0c; 日常我们的Maven 下载安装好以后&#xff0c;在IDE 里…...

如何把Qt exe文件发送给其他人使用

如何把Qt exe文件发送给其他人使用 1、先把 Debug改成Release2、重新构建项目3、运行项目4、找到release文件夹5、新建文件夹&#xff0c;存放exe文件6、打开qt控制台串口7、下载各种文件8、压缩&#xff0c;发送压缩包给别人 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[ ])&#xff0c; str1、str2是两个有序字符串&#xff08;其中字符按ASCII码从小到大排序&#xff09;&#xff0c;将str2合并到字符串str1中&#xff0c;要求合并后的字符串仍是有序的&#xff0c;允许字符重…...

实现 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

目录 一&#xff0c;3364. 最小正和子数组 二&#xff0c; 3365. 重排子字符串以形成目标字符串 三&#xff0c;3366. 最小数组和 四&#xff0c;3367. 移除边之后的权重最大和 一&#xff0c;3364. 最小正和子数组 本题可以直接暴力枚举&#xff0c;代码如下&#xff1a; …...

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是一个开源的、内存中的数据结构存储系统&#xff0c;它可以用作数据库、缓存和消息代理&#xff0c;支持多种数据类型。 一、数据类型介绍 String&#xff08;字符串&#xff09; Redis中最基本的数据类型。可以存储任何类型的数据&#xff0c;包括字符串、数字和二进制…...

基于Adafruit FLORA的红外遥控胸针DIY:从嵌入式编程到可穿戴艺术

1. 项目概述&#xff1a;一个藏在时尚配饰里的“电视终结者”几年前&#xff0c;我在一个朋友聚会上&#xff0c;发现大家明明在聊天&#xff0c;眼睛却总是不自觉地瞟向角落里那个正在播放无聊广告的电视。直接走过去关掉显得有点突兀&#xff0c;找遥控器又太麻烦。那一刻我就…...

终极免费Switch模拟器yuzu:解决电脑玩任天堂游戏的5大痛点

终极免费Switch模拟器yuzu&#xff1a;解决电脑玩任天堂游戏的5大痛点 【免费下载链接】yuzu 任天堂 Switch 模拟器 项目地址: https://gitcode.com/GitHub_Trending/yu/yuzu 想在电脑上畅玩Switch游戏却总是遇到各种问题&#xff1f;yuzu模拟器作为全球最受欢迎的开源任…...

告别混乱信号!用CANdb++ Editor从零搭建汽车CAN网络DBC文件(保姆级图文教程)

告别混乱信号&#xff01;用CANdb Editor从零搭建汽车CAN网络DBC文件&#xff08;保姆级图文教程&#xff09; 在汽车电子开发领域&#xff0c;CAN总线如同神经脉络般贯穿整车系统。我曾参与过一个新能源整车项目&#xff0c;由于早期缺乏规范的DBC文件&#xff0c;不同ECU厂商…...

STM32CubeIDE实战指南:从代码编译到一键下载的完整流程解析

1. STM32CubeIDE开发环境概述 对于刚接触STM32开发的工程师来说&#xff0c;选择一款合适的集成开发环境(IDE)至关重要。STM32CubeIDE是ST官方推出的免费开发工具&#xff0c;它集成了代码编辑、编译、调试和下载功能于一体&#xff0c;特别适合新手快速上手。我在实际项目中使…...

生物信息学逆向解析mRNA疫苗序列:从公开数据组装BNT-162b2与mRNA-1273的基因蓝图

1. 项目概述与背景解析 最近在生物信息学和疫苗研究领域&#xff0c;一个名为“NAalytics/Assemblies-of-putative-SARS-CoV2-spike-encoding-mRNA-sequences-for-vaccines-BNT-162b2-and-mRNA-1273”的项目引起了我的注意。这个项目标题看起来很长&#xff0c;但核心非常明确&…...

告别标题栏!在RK3568 Buildroot固件上,让你的Qt应用开机全屏显示的保姆级教程

RK3568嵌入式全屏实战&#xff1a;从Weston配置到Qt应用独占显示的完整指南 在嵌入式Linux系统开发中&#xff0c;GUI应用的全屏显示往往成为工程师面临的第一个"拦路虎"。当你在RK3568平台上精心开发的Qt应用启动后&#xff0c;却发现屏幕顶部顽固地挂着Weston窗口管…...

怎么判断一家工厂还在不在正常生产?6 类活跃度信号,从纸面到现场

跑工厂的销售员都遇到过这种事&#xff1a;手机里存着一份名单&#xff0c;导航开两小时&#xff0c;到门口才发现卷帘门焊死、车间长草、保安说"厂子去年就搬了"。 问题出在哪&#xff1f;大多数人判断"这家工厂在不在"&#xff0c;靠的是工商登记——执照…...

LLM应用快速演示框架:从架构解析到智能体开发的实战指南

1. 项目概述&#xff1a;一个面向开发者的LLM应用快速演示框架最近在GitHub上闲逛&#xff0c;发现了一个名为wronai/llm-demo的项目&#xff0c;点进去一看&#xff0c;瞬间觉得眼前一亮。这可不是又一个简单的“Hello World”式的大语言模型调用示例&#xff0c;而是一个结构…...

无代码物联网实战:基于ESP32与WipperSnapper的泳池水温监测方案

1. 项目概述&#xff1a;告别繁琐编程&#xff0c;用无代码方案守护泳池水温又到了打理泳池的季节&#xff0c;除了常规的清洁和化学平衡&#xff0c;水温其实是个挺关键的指标。水温不仅影响游泳的舒适度&#xff0c;也关系到泳池加热设备的能耗和泳池化学品的反应速率。以前想…...

大语言模型长上下文建模:从注意力优化到Mamba架构的工程实践

1. 项目概述&#xff1a;为什么长上下文建模是LLM的“圣杯”&#xff1f;如果你在过去一年里深度使用过任何主流的大语言模型&#xff0c;无论是ChatGPT、Claude还是开源的Llama、Qwen&#xff0c;一个共同的痛点一定让你印象深刻&#xff1a;“它好像不记得我们之前聊了什么”…...