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.mzph.cn/news/122064.shtml

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

相关文章

如何快速排查SSD IO延迟抖动问题?

一块固态硬盘设计背后&#xff0c;有硬件控制器&#xff0c;NAND闪存颗粒、DRAM&#xff0c;还有固件FTL算法等。SSD设计的本身其实是一件特别复杂的过程&#xff0c;需要考虑各种客户需求且要保证可靠性、性能、稳定性。 针对SSD的相关性能测试&#xff0c;SNIA也有专门针对SS…

【RabbitMQ 实战】12 镜像队列

一、镜像队列的概念 RabbitMQ的镜像队列是将消息副本存储在一组节点上&#xff0c;以提高可用性和可靠性。镜像队列将队列中的消息复制到一个或多个其他节点上&#xff0c;并使这些节点上的队列保持同步。当一个节点失败时&#xff0c;其他节点上的队列不受影响&#xff0c;因…

MIT Kimera-VIO-ROS 安装

前言 我安装Kimera-VIO-ROS的时间是2023.10.28。由于已经离Kimera发布过去两年&#xff0c;所以遇到版本不同步问题&#xff0c;Kimera-VIO&#xff0c;Kimera-VIO-ROS&#xff0c;GTSAM的版本需要精心挑选。 Kimera-VIO在2021.07.01之后没有更新&#xff0c;git commit版本为…

docker服务CPU飙高排查

Docker服务CPU飙高排查 什么是Docker服务CPU飙高&#xff1f; Docker是一个开源的容器化平台&#xff0c;它允许开发者将应用程序及其依赖项打包成一个独立的容器&#xff0c;以保证应用程序在不同的环境中都能够运行。然而&#xff0c;有时我们可能会遇到Docker服务CPU飙高的…

漏洞复现-showdoc文件上传_v2.8.3_(CNVD-2020-26585)

showdoc文件上传_v2.8.3_CNVD-2020-26585 漏洞信息 showdoc 2.8.3 以下版本中存在安全漏洞CNVD-2020-26585文件上传漏洞 描述 ShowDoc是一个非常适合IT团队的在线API文档、技术文档工具。通过showdoc&#xff0c;你可以方便地使用markdown语法来书写出美观的API文档、数据字…

Redis持久化机制的三种方式:RDB、AOF和混合持久化

Redis持久化机制的三种方式&#xff1a;RDB、AOF和混合持久化 Redis是一种高性能的内存数据结构存储系统&#xff0c;它提供了丰富的数据结构和操作&#xff0c;如键值对、列表、集合、哈希表等。然而&#xff0c;由于Redis是内存存储&#xff0c;一旦服务器停止运行&#xff…

java后端返回给前端不为空的属性

问题背景&#xff1a; 目前遇到的一个问题。一个对象里面定义了数组、集合、和字符串属性等&#xff0c;但是返回给前端的时候数组和集合都是空的&#xff0c;前端接收到的是“” 一个空字符。然后保存的时候又把空字符传给后端&#xff0c;出现了数据结构不匹配导致报错。 解…

Java8与JDK1.8与JDK8之间的关系是什么?

1.Java8等价于JDK8 2.JDK8或者JDK1.8是由于自从JDK1.5/JDK5命名方式改变后遗留的历史问题。所以JDK8或者JDK1.8是等价的。 2004年9月30日&#xff0c;J2SE1.5发布。为了表示该版本的重要性&#xff0c;J2SE 1.5更名为Java SE 5.0&#xff0c;从此开始&#xff0c;如下图像jav…

如何进行渗透测试以提高软件安全性?

对于各种规模的企业和组织来说&#xff0c;软件安全是一个至关重要的问题。随着网络攻击越来越复杂&#xff0c;软件中的漏洞越来越多&#xff0c;确保你的软件安全比以往任何时候都更重要。提高软件安全性的一个有效方法是渗透测试&#xff08;penetration testing&#xff09…

雨云游戏云面板服使用教程我的世界Forge服务端开服教程(翼龙面板)

雨云面板服目前支持一键开服的游戏有&#xff1a;Minecraft Java版、Minecraft 基岩版、泰拉瑞亚、饥荒&#xff0c;还提供纯Java/Linux环境&#xff08;Docker&#xff09;&#xff0c;方便开自己开其他游戏服。 其中Minecraft Java版支持一键开服的有Arclight、Mohist、CatS…

环形链表 II

一、题目描述 题目链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 二、题解 对于本题&#xff0c;我们可以得到以下结论&#xff1a; 让一个指针从链表起始位置开始遍历链表&#xff0c;同时让一个指针从判环时相遇点的位置开始绕…

原始流,缓冲流性能比较

一.低级字节流一个一个字节复制 1.代码 package org.example;import java.io.*;public class day13 {//原视频路径private static final String file1 "D:\\temp\\day05\\改名.mp4";//目的视频路径private static final String file2 "D:\\temp\\day05\\不改…

Ant-design-vue Table 列表 columns 将作为导出功能入参

将 Table 列表 columns 将作为导出功能入参&#xff0c;由于 columns 数据跟入参存在差异&#xff0c;因此我们抽离公共方法进行处理。 const handleExportColumnsData function (columns []) {if (!columns.length) return []return columns.filter(item > item.dataInde…

windows下OOM排查

如下有一段代码 package com.lm.demo.arthas.controller;import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController;import java.util.A…

C++学习day--24 推箱子游戏图像化开发

环境要求&#xff1a; 1、VS2015以上 2、成功安装并配置图形库 项目注意事项&#xff1a;代码复制好以后&#xff0c;把下面的字符集改为多字节字符集 第 1 节 项目需求 实现一款推箱子游戏&#xff0c;效果如下图所示 , 具体规则&#xff1a; 1. 箱子只能推动而不能拉动…

ROS笔记之visualization_msgs-Marker学习

ROS笔记之visualization_msgs-Marker学习 code review! 文章目录 ROS笔记之visualization_msgs-Marker学习一.line_strip例程二.line_list例程一二.line_list例程二二.TEXT_VIEW_FACING例程三.附CMakeLists.txt和package.xml五.关于odom、base_link和map坐标系六.关于visualiz…

TCP / UDP 概念 + 实验(计网自顶向下)

Github源码 moranzcw/Computer-Networking-A-Top-Down-Approach-NOTES: 《计算机网络&#xff0d;自顶向下方法(原书第6版)》编程作业&#xff0c;Wireshark实验文档的翻译和解答。 (github.com) 暂定打算分2步走&#xff0c;前置是中科大对应计网黑书的视频 第1步完成14个Wire…

模数转换器-ADC基础

文章目录 一、ADC是什么二、ADC处理采样保持量化编码三、ADC采样的重要参数:测量范围:分辨率(Resolution):精度:采样时间:采样率(Sampling Rate):信噪比(Signal-to-Noise Ratio, SNR):转换时间:一、ADC是什么 ADC(Analog-to-Digital Converter):模拟数字转换器…

van-uploader上传图片报错Invalid handler for event “load“(在uniapp编译)

van-uploader使用报错 原因&#xff1a;主要原因这里使用的vant版本是2.13.0的&#xff0c;在Hbuild里面运行的项目&#xff0c;vant插件在这里会有部分组件有兼容问题&#xff0c;&#xff08;van-image&#xff0c;van-uploader等&#xff09;。 解决&#xff1a;主要是要实…

设置Ubuntu 20.04的静态IP地址(wifi模式下)

一、引言 自己家用的Ubuntu的&#xff0c;重启后ip地址经常会改变&#xff0c;这个时候就需要我们手动配置静态IP了。 二、优点 给Ubuntu设置一个静态IP地址有以下几个好处&#xff1a; 持久性&#xff1a;静态IP地址是固定不变的&#xff0c;与设备的MAC地址绑定。这意味着…