【QT】 QT开发PDF阅读器

很高兴在雪易的CSDN遇见你 ,给你糖糖

欢迎大家加入雪易社区-CSDN社区云 


前言

本文分享QT开发PDF阅读器技术,希望对各位小伙伴有所帮助!

感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步!

你的点赞就是我的动力(^U^)ノ~YO

结果展示:

我将收获到的:

        1. 如何创建PDFViewer

        2.创建PDFViewer所依赖的QT库

        3.PDFViewer的用处

目录

前言

1.准备PDFViewer所依赖的库

2.创建PDF Viewer

小结:


1.准备PDFViewer所依赖的库

        》使用开发的QT版本:5.15.2

        》存在问题:不能直接添加PDF模块

        》原因:QT5.15.2版本已带有pdf模块,但并未在include中包含,但是在lib和bin目录下能找到相应的.lib和.dll文件。

        》解决方案:

                》下载QT5.15.2源码

                》将“Qt\5.15.2\Src\qtwebengine\include”文件夹下的QtPdf和QtPdfWidgets复制到“Qt\5.15.2\msvc2019_64\include”文件夹下。

                》 将“Qt\5.15.2\Src\qtwebengine\src\pdf\api”文件夹下的.h文件复制到“Qt\5.15.2\msvc2019_64\include\QtPdf”文件夹下。

                》 将“Qt\5.15.2\Src\qtwebengine\src\pdfwidgets”文件夹下的.h文件复制到“Qt\5.15.2\msvc2019_64\include\QtPdfWidgets”文件夹下 

                 》我已将QtPdf整理成单独的依赖库,需要的小伙伴可以联系我下载。

                    也上传CSDN,下载地址:QT开发PDF阅读器,代码简洁易用!资源-CSDN文库 

2.创建PDF Viewer

        》创建UI文件

        》核心为PageSelector(页面选择)和ZoomSelector(缩放)

        》下载地址:QT开发PDF阅读器,代码简洁易用!资源-CSDN文库

        》代码如下:

        PageSelector.h文件

#ifndef PAGESELECTOR_H
#define PAGESELECTOR_H#include <QWidget>class QLabel;
class QLineEdit;
class QPdfDocument;
class QPdfPageNavigation;
class QToolButton;class PageSelector : public QWidget
{Q_OBJECTpublic:explicit PageSelector(QWidget *parent = nullptr);void setPageNavigation(QPdfPageNavigation *pageNavigation);private slots:void onCurrentPageChanged(int page);void pageNumberEdited();private:QPdfPageNavigation *m_pageNavigation;QLineEdit *m_pageNumberEdit;QLabel *m_pageCountLabel;QToolButton *m_previousPageButton;QToolButton *m_nextPageButton;
};#endif // PAGESELECTOR_H

        PageSelector.cpp文件

#include "pageselector.h"#include <QHBoxLayout>
#include <QLabel>
#include <QLineEdit>
#include <QPdfPageNavigation>
#include <QToolButton>PageSelector::PageSelector(QWidget *parent): QWidget(parent), m_pageNavigation(nullptr)
{QHBoxLayout *layout = new QHBoxLayout(this);m_previousPageButton = new QToolButton(this);m_previousPageButton->setText("<");m_previousPageButton->setEnabled(false);m_pageNumberEdit = new QLineEdit(this);m_pageNumberEdit->setAlignment(Qt::AlignRight);m_pageCountLabel = new QLabel(this);m_pageCountLabel->setText("0");m_nextPageButton = new QToolButton(this);m_nextPageButton->setText(">");m_nextPageButton->setEnabled(false);layout->addWidget(m_previousPageButton);layout->addWidget(m_pageNumberEdit);layout->addWidget(m_pageCountLabel);layout->addWidget(m_nextPageButton);
}void PageSelector::setPageNavigation(QPdfPageNavigation *pageNavigation)
{m_pageNavigation = pageNavigation;connect(m_previousPageButton, &QToolButton::clicked, m_pageNavigation, &QPdfPageNavigation::goToPreviousPage);connect(m_pageNavigation, &QPdfPageNavigation::canGoToPreviousPageChanged, m_previousPageButton, &QToolButton::setEnabled);connect(m_pageNavigation, &QPdfPageNavigation::currentPageChanged, this, &PageSelector::onCurrentPageChanged);connect(m_pageNavigation, &QPdfPageNavigation::pageCountChanged, this, [this](int pageCount){ m_pageCountLabel->setText(QString::fromLatin1("/ %1").arg(pageCount)); });connect(m_pageNumberEdit, &QLineEdit::editingFinished, this, &PageSelector::pageNumberEdited);connect(m_nextPageButton, &QToolButton::clicked, m_pageNavigation, &QPdfPageNavigation::goToNextPage);connect(m_pageNavigation, &QPdfPageNavigation::canGoToNextPageChanged, m_nextPageButton, &QToolButton::setEnabled);onCurrentPageChanged(m_pageNavigation->currentPage());
}void PageSelector::onCurrentPageChanged(int page)
{if (m_pageNavigation->pageCount() == 0)m_pageNumberEdit->setText(QString::number(0));elsem_pageNumberEdit->setText(QString::number(page + 1));
}void PageSelector::pageNumberEdited()
{if (!m_pageNavigation)return;const QString text = m_pageNumberEdit->text();bool ok = false;const int pageNumber = text.toInt(&ok);if (!ok)onCurrentPageChanged(m_pageNavigation->currentPage());elsem_pageNavigation->setCurrentPage(qBound(0, pageNumber - 1, m_pageNavigation->pageCount() - 1));
}

        ZoomSelector.h文件

#ifndef ZOOMSELECTOR_H
#define ZOOMSELECTOR_H#include <QComboBox>
#include <QPdfView>class ZoomSelector : public QComboBox
{Q_OBJECTpublic:explicit ZoomSelector(QWidget *parent = nullptr);public slots:void setZoomFactor(qreal zoomFactor);void reset();signals:void zoomModeChanged(QPdfView::ZoomMode zoomMode);void zoomFactorChanged(qreal zoomFactor);private slots:void onCurrentTextChanged(const QString &text);
};#endif // ZOOMSELECTOR_H

        ZoomSelector.cpp文件

#include "zoomselector.h"#include <QLineEdit>ZoomSelector::ZoomSelector(QWidget* parent): QComboBox(parent)
{setEditable(true);addItem(QLatin1String("Fit Width"));addItem(QLatin1String("Fit Page"));addItem(QLatin1String("12%"));addItem(QLatin1String("25%"));addItem(QLatin1String("33%"));addItem(QLatin1String("50%"));addItem(QLatin1String("66%"));addItem(QLatin1String("75%"));addItem(QLatin1String("100%"));addItem(QLatin1String("125%"));addItem(QLatin1String("150%"));addItem(QLatin1String("200%"));addItem(QLatin1String("400%"));connect(this, static_cast<void(QComboBox::*)(const QString&)>(&QComboBox::currentIndexChanged),this, &ZoomSelector::onCurrentTextChanged);connect(lineEdit(), &QLineEdit::editingFinished,this, [this]() {onCurrentTextChanged(lineEdit()->text()); });
}void ZoomSelector::setZoomFactor(qreal zoomFactor)
{setCurrentText(QString::number(qRound(zoomFactor * 100)) + QLatin1String("%"));
}void ZoomSelector::reset()
{setCurrentIndex(8); // 100%
}void ZoomSelector::onCurrentTextChanged(const QString& text)
{if (text == QLatin1String("Fit Width")) {emit zoomModeChanged(QPdfView::FitToWidth);}else if (text == QLatin1String("Fit Page")) {emit zoomModeChanged(QPdfView::FitInView);}else {qreal factor = 1.0;QString withoutPercent(text);withoutPercent.remove(QLatin1Char('%'));bool ok = false;const int zoomLevel = withoutPercent.toInt(&ok);if (ok)factor = zoomLevel / 100.0;emit zoomModeChanged(QPdfView::CustomZoom);emit zoomFactorChanged(factor);}
}

小结:

        本文主要分享了开发PDF阅读器所依赖的库,以及开发的过程,谢谢各位小伙伴的关注。

感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步!

你的赞赏是我的最最最最大的动力(^U^)ノ~YO

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于MATLAB小波变换的信号突变点检测

之前在不经意间也有接触过求突变点的问题。在我看来&#xff0c;与其说是求突变点&#xff0c;不如说是我们常常玩的"找不同"。给你两幅图像&#xff0c;让你找出两个图像中不同的地方&#xff0c;我认为这其实也是找突变点在生活中的应用之一吧。回到找突变点位置上…

强化学习研究 PG

由于一些原因&#xff0c; 需要学习一下强化学习。用这篇博客来学习吧&#xff0c; 用的资料是李宏毅老师的强化学习课程。 深度强化学习(DRL)-李宏毅1-8课&#xff08;全&#xff09;_哔哩哔哩_bilibili 这篇文章的目的是看懂公式&#xff0c; 毕竟这是我的弱中弱。 强化…

【SpringBoot框架篇】33.优雅集成i18n实现国际化信息返回

文章目录 1.简介2.MessageSource配置和工具类封装2.1.配置MessageSource相关配置2.2.配置工具类2.3.测试返回国际级文本信息 3.不优雅的web调用示例(看看就行&#xff0c;别用)4.优雅使用示例4.1.错误响应消息枚举类4.2.ThreadLocal工具类配置4.2.1.ThreadLocal工具类数据封装4…

git原理与使用

目录 引入基本操作分支管理远程操作标签管理 引入 假设你的老板要你设计一个文档&#xff0c;当你设计好了&#xff0c;拿给他看时&#xff0c;他并不是很满意&#xff0c;就要你拿回去修改&#xff0c;你修改完后&#xff0c;再给他看时&#xff0c;他还是不满意&#xff0c;…

python爬虫相关

目录 初识爬虫 爬虫分类 网络爬虫原理 爬虫基本工作流程 搜索引擎获取新网站的url robots.txt HTHP协议 Resquests模块 前言&#xff1a; 安装 普通请求 会话请求 response的常用方法 简单案例 aiohttp模块 使用前安装模块 具体案例 数据解析 re解析 bs4…

每次执行@Test方法前都执行一次DB初始化(SpringBoot Test + JUnit5环境)

引言 在执行单元测试时&#xff0c;可以使用诸如H2内存数据库替代线上的Mysql数据库等&#xff0c;如此在执行单元测试时就能尽可能模拟真实环境的SQL执行&#xff0c;同时也无需依赖线上数据库&#xff0c;增加了测试用例执行环境的可移植性。而使用H2数据库时&#xff0c;通…

C#程序的启动显示方案(无窗口进程发送消息) - 开源研究系列文章

今天继续研究C#的WinForm的实例显示效果。 我们上次介绍了Winform窗体的唯一实例运行代码(见博文&#xff1a;基于C#的应用程序单例唯一运行的完美解决方案 - 开源研究系列文章 )。这就有一个问题&#xff0c;程序已经打开了&#xff0c;这时候再次运行该应用程序&#xff0c;…

16 Springboot——登录功能实现

16.1 修改index.html中表单跳转的地址 将action的地址改为user/login&#xff0c;意思是点击提交按钮后&#xff0c;就会跳转到user/login地址&#xff0c;然后只要用Controller类的RequsetMapping去接这个地址就行了。 <body class"text-center"><form cl…

Spring 是如何解决循环依赖问题的?

项目场景&#xff1a; 提示&#xff1a;这里简述项目相关背景&#xff1a; 例如&#xff1a;项目场景&#xff1a;示例:通过蓝牙芯片(HC-05)与手机 APP 通信&#xff0c;每隔 5s 传输一批传感器数据(不是很大) 问题描述 我们都知道&#xff0c;如果在代码中&#xff0c;将两个…

记录一次因为代码混淆导致的安卓app崩溃的事件

最近公司布置了一个新任务&#xff0c;给一个旧的安卓app增加一个新功能。 功能是替换加密算法&#xff0c;新的算法库由第三法提供&#xff0c;通过jni调用底层C库。 按照项目需求&#xff0c;修改了代码&#xff0c;调试测试阶段也都运行正常。结果发布的时候&#xff0c;测…

视频网站如何选择国外服务器?

​ 视频网站如何选择国外服务器? 地理位置&#xff1a;选择靠近目标用户群体的国外服务器位置是至关重要的。若用户主要集中在中国以外的地区&#xff0c;因您应选择位于用户所在地附近的服务商&#xff0c;以确保视频的传输速度。 带宽和速度&#xff1a;选择带宽足够且方便升…

【论文阅读】对抗溯源图主机入侵检测系统的模仿攻击(NDSS-2023)

作者&#xff1a;伊利诺伊大学芝加哥分校-Akul Goyal、Gang Wang、Adam Bates&#xff1b;维克森林大学-Xueyuan Han、 引用&#xff1a;Goyal A, Han X, Wang G, et al. Sometimes, You Aren’t What You Do: Mimicry Attacks against Provenance Graph Host Intrusion Detect…