039-第三代软件开发-PDF阅读器

头图

第三代软件开发-PDF阅读器

文章目录

  • 第三代软件开发-PDF阅读器
    • 项目介绍
    • PDF阅读器
      • 1 初始化PDF view
      • 2 qml 中使用
      • 3 创建模块

关键字: QtQmlpdfLTDev本地

项目介绍

欢迎来到我们的 QML & C++ 项目!这个项目结合了 QML(Qt Meta-Object Language)和 C++ 的强大功能,旨在开发出色的用户界面和高性能的后端逻辑。

在项目中,我们利用 QML 的声明式语法和可视化设计能力创建出现代化的用户界面。通过直观的编码和可重用的组件,我们能够迅速开发出丰富多样的界面效果和动画效果。同时,我们利用 QML 强大的集成能力,轻松将 C++ 的底层逻辑和数据模型集成到前端界面中。

在后端方面,我们使用 C++ 编写高性能的算法、数据处理和计算逻辑。C++ 是一种强大的编程语言,能够提供卓越的性能和可扩展性。我们的团队致力于优化代码,减少资源消耗,以确保我们的项目在各种平台和设备上都能够高效运行。

无论您是对 QML 和 C++ 开发感兴趣,还是需要我们为您构建复杂的用户界面和后端逻辑,我们都随时准备为您提供支持。请随时联系我们,让我们一同打造现代化、高性能的 QML & C++ 项目!

重要说明☝

☀该专栏在第三代软开发更新完将涨价

PDF阅读器

同上篇【038_第三代软件开发-简易视频播放器自定义Slider (二)】一样,这个功能就是为了显示我们的软件说明书。同样适用平率不怎么搞,而QML本身好像不怎么具备PDF文件的预览的。这里我最开始向导的就是使用web来实现,并且我真的非常非常认真的让GPT给我写了一个H5,我在Google浏览器里面测试没有问题。代码如下:

<!DOCTYPE html>
<html>
<head><title>打开和预览本地PDF文件</title>
</head>
<body><input type="file" id="pdfInput" accept=".pdf"><embed id="pdfPreview" type="application/pdf" width="100%" height="600px"><script>document.getElementById('pdfInput').addEventListener('change', function(e) {var file = e.target.files[0];var reader = new FileReader();reader.onload = function(e) {document.getElementById('pdfPreview').setAttribute('src', e.target.result);};reader.readAsDataURL(file);});</script>
</body>
</html>

在上述示例中,我们使用了<input type="file">元素来创建一个选择文件的输入框,并通过添加accept=".pdf"来限制只能选择PDF文件。接下来,我们使用<embed>元素来创建一个用于预览PDF文件的窗口。

当用户选择一个PDF文件后,change事件将被触发。我们在事件处理程序中获取用户选择的文件对象,并创建一个FileReader对象来读取文件内容。读取完成后,我们将结果(即PDF文件的数据URL)赋值给<embed>标签的src属性,以便在窗口中预览PDF文件。

请注意,由于安全限制,Web浏览器可能会阻止直接在页面中预览本地文件。因此,这个示例可能在某些浏览器中无法正常工作。

但是呢,当我把这个放到Qt里面的时候,发现无法使用,所以我转向的万能的github。最后,我发现了一个线程的轮子可以用,很遗憾的是我没有存链接,我好找了一圈,也没有再次找到,也没有fork 一下。所以我把目前的这部分代码打包了一下,上传了,0积分下载,大家可以直接下载使用。

链接地址:https://download.csdn.net/download/z609932088/88171703?spm=1001.2014.3001.5503

1 初始化PDF view

首先我们需要在main.cpp里面包含头文件

#include <QtWebView/QtWebView>#include "it/ltdev/qt/cpp/components/qtpdfviewerinitializer.h"

紧接着需要咋我们的QApplication创造前完成初始化

LTDev::QtPdfViewerInitializer::initialize(); 		

在完成QApplication初始化后链接QApplication结束信号槽

QObject::connect(&app, &QApplication::aboutToQuit, LTDev::QtPdfViewerInitializer::getInstance(), LTDev::QtPdfViewerInitializer::deleteInstance);

完成以上基本,这里我们可以编译一下,看下是否存在问题,存在修复即可,不存在,就可以在QML中包含对应模块,使用了。

2 qml 中使用

首先同样,需要在qml import相关模块,最后一个就是我们的pdf模块

import QtWebView 1.15
import QtWebEngine 1.10
import it.ltdev.qt.qml.components 1.0 as LTDev

3 创建模块

这部分就可以把它当做有个普通的控件来使用就可以了,重要的我在注释中也说了,在ubuntu 下是需要–no-sandbox参数运行程序的。

/*WebView 模块运行需要加 --no-sandbox参数--no-sandbox 参数不能使用 gdb调试,如果要使用gdb 调试,可以先把这个注释掉,这个就是一个展示帮助文档的PDF*/LTDev.PdfView {id: pdfViewanchors.fill: parentvisible: trueonError: {pdfView.visible = falsepdfView.opacity = 0var json = JSON.parse(message)}onViewerLoaded: {pdfView.load("/home/UserHelp.pdf")}onPdfLoaded: {pdfView.visible = truepdfView.opacity = 1}}

博客签名2021

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

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

相关文章

python二次开发Solidworks:齿轮生成器

目录 1、参数 2、手动建模 2.1方程式驱动曲线画渐开线 2.2画基圆、齿根圆、分度圆和齿顶圆 2.3画单个齿廓 2.4以齿厚拉伸基圆草图 2.5以齿厚拉伸单齿廓草图 2.6阵列齿数个单齿 3、python自动化建模 4、总结 1、参数 模数 "m" 2 齿数"z" 50 压…

白嫖在线云服务器,免费在 linux 服务器使用 docker 。 附视频+附文档

白嫖在线云服务器&#xff0c;免费在 linux 服务器使用 docker 。 附视频附文档 文章目录 前言启动 Nginx 案例最后 视频&#xff1a;https://www.bilibili.com/video/BV1WN411W79V/ 国内互联网经过多年发展&#xff0c;单体应用已经无法支持我们的互联网业务&#xff0c;分布…

Python---练习:有一物,不知其数,三三数之余二,五五数之余三,七七数之余二,问物几何?

案例&#xff1a; 有一物&#xff0c;不知其数&#xff0c;三三数之余二&#xff0c;五五数之余三&#xff0c;七七数之余二&#xff0c;问物几何&#xff1f; 人话&#xff1a; 有一个数字&#xff0c;不知道具体是多少&#xff0c;用3去除剩2&#xff0c;用5去除剩3&#…

Spring Boot进阶(93):体验式教程:手把手教你整合Spring Boot和Zipkin

&#x1f4e3;前言 分布式系统开发中&#xff0c;服务治理是一个比较重要的问题。为了更好地实现服务治理&#xff0c;需要解决服务跟踪问题&#xff0c;即如何对分布式系统中的服务进行监控和追踪。本文将介绍如何使用Zipkin进行服务跟踪&#xff0c;并结合Spring Boot进行整合…

Spring Cloud之微服务

目录 微服务 微服务架构 微服务架构与单体架构 特点 框架 总结 SpringCloud 常用组件 与SpringBoot关系 版本 微服务 微服务&#xff1a;从字面上理解即&#xff1a;微小的服务&#xff1b; 微小&#xff1a;微服务体积小&#xff0c;复杂度低&#xff0c;一个微服…

小程序如何设置首选配送公司

小程序的一个重要环节就是配送服务。为了提供更好的发货体验&#xff0c;避免商家总是要在众多的配送公司中选择想要&#xff0c;小程序支持设置首选配送。下面将具体介绍一下小程序如何设置。 在小程序管理员后台->配送设置->首选配送处&#xff0c;指定需要设置的首选…

2.MySQL的调控按钮——启动选项和系统变量

2.MySQL的调控按钮——启动选项和系统变量 1.启动选项和配置文件1.1 在命令行上使用选项1.2 配置文件中使用选项1.2.1 配置文件路径1.2.2 配置文件的内容1.2.3 特定 MySQL 版本的专用选项组1.2.4 配置文件的优先级1.2.5 同一个配置文件中多个组的优先级1.2.6 defaults-file 的使…

基于5G工业CPE打造智慧煤矿无人巡检监测应用

煤炭是我国重要的能源资源&#xff0c;对于煤炭的开采和利用也是我国重要的工业产业部分。得益于5G物联网技术的发展普及&#xff0c;煤矿场景也迎来智能化升级&#xff0c;实现了包括智能采掘、智能调度、无人运输、无人巡检等新型应用&#xff0c;极大提升了煤矿采运产业的效…

【软考】10.1 算法特性/时间复杂度/递归/分治/动态规划

《算法》 《时间复杂度》 n 的最高次项 渐进符号 算法复杂度 线性级 O&#xff08;n&#xff09;&#xff1a;顺序查找对数级 O&#xff08;logn&#xff09;&#xff1a;对半查找、快速查找、归并算法 《递归》 时间复杂度 《分治法》 《动态规划法》 适用于求全局最优解构建…

【华为HCIP | 职业认证考试】821每日一刷

个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名大三在校生&#xff0c;喜欢编程&#x1f38b; &#x1f43b;‍❄️个人主页&#x1f947;&#xff1a;落798. &#x1f43c;个人WeChat&#xff1a;hmmwx53 &#x1f54a;️系列专栏&#xff1a;&#x1f5bc;️ 零…

听GPT 讲Rust源代码--library/std(7)

题图来自 Programming languages: How Google is using Rust to reduce memory safety vulnerabilities in Android[1] File: rust/library/std/src/sys/unix/kernel_copy.rs 在Rust的标准库中&#xff0c;kernel_copy.rs文件位于sys/unix目录下&#xff0c;其主要作用是实现特…

IP地址与代理ip在网络安全中的关键作用

目录 前言 一、IP地址在网络安全中的作用 1、网络流量监视和分析 2、网络安全事件响应 3、网络安全检测和防御 二、代理IP在网络安全中的作用 1、流量过滤和清洗 2、匿名访问和保护隐私 3、实现全球化业务 三、IP地址和代理IP在网络安全中的应用案例 1、DDoS攻击 2…

消息队列中间件面试笔记总结RabbitMQ,Kafka,RocketMQ

文章目录 (一) Rabbit MQRabbitMQ 核心概念消息队列的作用Exchange(交换器)Broker&#xff08;消息中间件的服务节点&#xff09;如何保证消息的可靠性如何保证 RabbitMQ 消息的顺序性如何保证 RabbitMQ 高可用的&#xff1f;如何解决消息队列的延时以及过期失效问题消息堆积问…

react-高阶组件

一、什么是高阶组件 高阶组件&#xff08; Higher-Order Component&#xff0c;HOC &#xff09;是一个以组件作为参数&#xff0c;返回一个新组件的函数。 高阶组件最大的特点就是复用组件逻辑高阶组件本身并不是 React 的 API&#xff0c;而是React组件的一种设计模式&…

js中HTMLCollection如何循环

//不带索引 let divCon document.getElementsByClassName("el-form-item__error"); if (divCon.length > 0) {for (var item of divCon) {console.log("打印&#xff1a;", item.innerText);} }//带有索引 let divCon document.getElementsByClassNam…

【JAVA学习笔记】46 - (43)第十一章作业

项目代码 https://github.com/yinhai1114/Java_Learning_Code/tree/main/IDEA_Chapter11/src/com/yinhai/homework11 1.枚举类 1.创建一个Color枚举类 2.有RED,BLUE,BL ACK,YELLOW,GREEN这个五个枚举值/对象: 3. Color有三 个属性redValue, greenValue, blueValue, 4.创建构…

2023高频前端面试题-http

1. HTTP有哪些⽅法&#xff1f; HTTP 1.0 标准中&#xff0c;定义了3种请求⽅法&#xff1a;GET、POST、HEAD HTTP 1.1 标准中&#xff0c;新增了请求⽅法&#xff1a;PUT、PATCH、DELETE、OPTIONS、TRACE、CONNECT 2. 各个HTTP方法的具体作用是什么&#xff1f; 方法功能G…

fatfs对于exFAT的使用

f_mkfs的介绍 f_mkfs是FatFs库中的一个函数&#xff0c;用于在指定的磁盘上执行格式化操作。它可以用于创建新的文件系统或重新格式化已有的文件系统。 函数原型如下&#xff1a; FRESULT f_mkfs (const TCHAR* path, // 磁盘路径BYTE opt, // 格式化选项DWORD a…

Anaconda下载和安装

1.概述 1&#xff09;包含conda&#xff1a;conda是一个环境管理器&#xff0c;其功能依靠conda包来实现&#xff0c;该环境管理器与pip类似。 2&#xff09;安装大量工具包&#xff1a;Anaconda会自动安装一个基本的python&#xff0c;该python的版本Anaconda的版本有关。该…

ETL工具Kettle

1 Kettle的基本概念 一个数据抽取过程&#xff0c;主要包括创建一个作业&#xff08;Job&#xff09;&#xff0c;每个作业由一个或多个作业项&#xff08;Job Entry&#xff09;和连接作业项的作业跳&#xff08;Job Hop&#xff09;组成。每个作业项可以是一个转换&#xff…