pyqt5实现帮助文档功能

        一般稍微复杂的软件都有帮助文档,用来引导用户慢慢熟悉软件功能,介绍软件的使用细节,今天我也想在分析软件中添加这个功能,实现帮助文档功能其实有几种方式,一种是只实现一个超链接功能,然后把文档做在线上网站上,一种是离线的文档,直接在软件中打开,今天主要是实现离线文档的方式,因为这种方式涉及到的技术点更多,那种在线的其实跟桌面开发就没什么关系了。

        第一步,技术路线,一般这种帮助文档都是有图和文本的,如果只是单纯的文本,就好办很多,最简单的用一个text框就能实现了,但是有图有文这种富文本的我觉得html是比较合适的,所以我这里采用是用pyqt5呈现html的方式实现。

        第二步,技术路线确定后,那么就开始查找相关资料看pyqt5中怎么显示html,这块我之前接触过一些,但是是很多年前了,那时候pyqt中有个叫webkit的东西,它是苹果开源的一个浏览器组件,后来被qt项目集成了,对应的python绑定为qtwebkit,但是因为年代太久远了,最新的百度显示这个组件已经逐渐被废弃了,qt又集成一个新的浏览器组件,叫pyqtwebengine,于是我就开始研究这个组件,但是第一步安装就出问题了,不知道是我环境的问题还是怎么,不是缺这个就是缺那个,经过一番折腾,终于确定要安装的包,我这里是

pyqtwebengine-qt5==5.15.2
pyqtwebengine==5.15.6

开始我以为这两个包是一个东西,装一个就行,在网上看一般只装其中的一个,装下面的那个居多,但是在我这,单独装哪个都报错,所以我测试的结果是两个都装。

        第三步,依赖装好后,就可以调代码了,其实要想显示个html还是比较简单的,下面是一个示例:

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow
from PyQt5.QtWebEngineWidgets import QWebEngineView
 
class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.web_view = QWebEngineView()
        self.setCentralWidget(self.web_view)
 
    def load_html(self, html_content):
        self.web_view.setHtml(html_content)
 
def main():
    app = QApplication(sys.argv)
    window = MainWindow()
    html_content = """
    <html>
        <head><title>PyQt5 HTML Page</title></head>
        <body><h1>Hello, HTML!</h1></body>
    </html>
    """
    window.load_html(html_content)
    window.show()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

这个是文心一言给的一段代码(可以直接运行),演示了怎么是用pyqt显示html,主要逻辑就是创建一个webEngineView,然后调用setHtml方法就可以显示html页面了,但是我们一般不会用这种方式,我们最常用的方式还是传一个url,然后加载页面,这里有两种情况,一种是普通的http/https这种的url,这个没什么好说的,很简单,也没什么太多需要注意的问题,下面是一段加载在线网页的代码:

import sys
from PyQt5.Qt import *
from PyQt5.QtWidgets import QApplication, QMainWindow
from PyQt5.QtWebEngineWidgets import QWebEngineView
 
class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.web_view = QWebEngineView()
        self.setCentralWidget(self.web_view)
 
    def load_html(self, url):
        self.web_view.load(QUrl(url))
 
def main():
    app = QApplication(sys.argv)
    window = MainWindow()
    url = "https://www.baidu.com"
    window.load_html(url)
    window.show()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

然后重点说下加载本地网页的代码,当然逻辑其实不复杂,主要注意一点是url的处理,第一点如果加载本地网页,路径必须用绝对路径,什么是绝对路径,就是从盘符开始的那种路径,而不能用相对路径,第二点,必须调用QUrl.fromLocalFile方法处理,否则会报错,示例代码如下

import sys
from PyQt5.Qt import *
from PyQt5.QtWidgets import QApplication, QMainWindow
from PyQt5.QtWebEngineWidgets import QWebEngineView
 
class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.web_view = QWebEngineView()
        self.setCentralWidget(self.web_view)
 
    def load_html(self, url):
        self.web_view.load(QUrl.fromLocalFile(url))
 
def main():
    app = QApplication(sys.argv)
    window = MainWindow()
    url = "https://www.baidu.com"
    local_url = r"E:\Projects\Webapp\11.html"
    window.load_html(local_url)
    window.show()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

和上面代码的主要区别就是url这块的处理。

        好的,最简单的显示网页的功能其实就已经实现了,然后说下这个文档的处理,我这里原始的帮助文档是一个word格式的,但是我需要的是html格式的,怎么办,这个其实很好办,只要用word另存一份html版本的就可以了,但是存的的时候要注意,word里支持很多中html格式,比如单个网页(mhtml),网页(htm,html),筛选过的网页(htm,html),经过我的测试,这里需要选择筛选过的网页,其它两种我试过本地打开后都没有图片,不知道怎么回事,也没去细究,好在有个能用的,文档转好以后(转换后包含两个文件一个htm,一个资源文件就是图片什么的,都要拷贝到项目目录)就可以拷贝到项目目录了。

        至此,其实功能部分已经实现了,本以为可以开开心心打包发布的时候,打包又出问题了,报错截图

 开始我以为是pyinstaller的问题,有些资源没打包进来,但是我一搜,其实这个文件已经被打包进来了,那为什么还报找不到呢,于是就开始百度,搜到一篇博文说是要把一些文件拷贝到项目根目录,参考知乎使用pyinstaller打包pyside2程序时出现找不到qtwebengineprocess.exe问题的解决方案 - 知乎 (zhihu.com)

 按照博文操作一番后,别说,确实管用了,至少进程不退出了,但是也没有太完美,还有一些警告说找不到资源什么的,于是我在想有没有更好的解决方案,就又开始一通百度,终于找到另一个说法Qt5 问题:Could not find QtWebEngineProcess.exe-CSDN博客,第一个注意事项,编译目录有没有中文,这个不用检查,因为我这个项目一直是在含有中文路径下打包的,一直没出过问题,直到今天,于是我换了一个路径,结果直接就好了,也不用拷贝那些exe还有conf到项目根目录了,就是中文路径的问题,qt直接懵逼了,给我也整懵逼了,难受。为了不再因为中文路径出问题,我永久的更换了项目目录。

        总结,原本一个以为很简单的功能,做了一天,各种坑啊,所以编程这东西就跟拆盲盒一样,你永远不知道迎接你的是什么东西。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何编写可读性高的嵌入式 C 语言代码?|2024网盘分享6.89G嵌入式-物联网 嵌入式新手C语言必学教程

目录 面向对象的 C 基础知识 结构体 函数指针 将函数指针作为结构体的成员 面向对象语言的特性 语言层次的面向对象 C 语言的面向对象 定义接口 接口的实现 测试 测试代码 结束语 面向对象的 C 面向对象的语言更接近人的思维方式&#xff0c;而且在很大程度上降低了…

N1CTF 2021 -- baby_guess

前言 这个题目与之前做的有所不同&#xff0c;题目并不是创建的一个字符设备或 misc 设备&#xff0c;而是注册了一个新的协议。但是就利用而言跟之前没啥区别&#xff0c;由于不是搞内核开发的&#xff0c;就简单看了看相关的知识 题目分析 内核版本&#xff1a;v5.4.142sm…

STM32使用ESP01S连接阿里云物联网平台

一、ESP01S烧录MQTT固件准备 首先准备好烧录工具&#xff0c;可以从官网上进行下载。 MQTT固件官网网址&#xff1a;AT固件汇总 | 安信可科技 (ai-thinker.com) 进去后如下图界面&#xff0c;向下翻找找到MQTT固件&#xff08;1471&#xff09;下载固件即可。 烧录工具光网地…

windows轻松管理nodejs 版本 升/降级 卸载等等

#nvm-windows 管理nodejs 版本神器# 不经意升级了node版本导致原有项目启动异常, 看到了node版本管理神器:nvm-windos 1,先下载 nvm >> git 选择如下安装包或 nvm-setup.exe文件 https://github.com/coreybutler/nvm-windows/releases/tag/1.1.12 2. 双击安装,下一…

DuDuTalk:4G桌面拾音设备在银行网点服务场景的应用价值

随着科技的飞速发展&#xff0c;银行业也在不断地寻求创新以提高服务质量和效率。在这个过程中&#xff0c;4G桌面拾音设备作为一种新型的智能设备&#xff0c;其在银行网点服务场景中的应用价值逐渐凸显出来。本文将从多个角度探讨4G桌面拾音设备在银行网点服务场景的应用价值…

Capl中的运算符

Capl中的运算符类似于C语言。由于capl中没有指针的概念&#xff0c;所以没有指针取值&#xff0c;取地址等运算符。 Capl中的运算符优先级同C语言一样&#xff0c;同样小括号可以 提升优先级。 1.算数运算符 整数类型之间的数据进行除法运算&#xff0c;结果一定是整数。如果…

HTML4(四)

1. 框架标签 <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><title>框架标签</title></head><body><!-- 利用iframe嵌入一个普通网页 --><iframe src"https://www.toutia…

Python专题:六、循环语句(1)

补充知识 代码的注释 #描述性文字 阅读代码的人更好的理解代码 while循环语句 x<100条件控制语句&#xff0c;Totalx,Total自增加x&#xff0c;x1&#xff0c;x自增加1&#xff0c;x<100此条件满足时&#xff0c;执行while循环&#xff0c;当x101时&#xff0c;x101条…

WebRtc 视频通话,语音通话实现方案

先了解一下流程 和 流程图(chatGpt的回答) 实现 (底层代码实现, 可作为demo熟悉) 小demo <template><div><video ref"localVideo" autoplay muted></video> <!-- 本地视频元素&#xff0c;用于显示本地视频 --><video ref"r…

Threejs 学习笔记 | 灯光与阴影

文章目录 Threejs 学习笔记 | 灯光与阴影如何让灯光照射在物体上有阴影LightShadow - 阴影类的基类平行光的shadow计算投影属性 - DirectionalLightShadow类平行光的投射相机 聚光灯的shadow计算投影属性- SpotLightShadow类聚光灯的投射相机 平行光 DirectionalLight聚光灯 Sp…

企业数据有什么价值?

在当下的数字经济时代&#xff0c;数据已上升为国家重要的基础性战略资源&#xff0c;加快建设数字中国、网络强国这一蓝图的实现&#xff0c;离不开数据要素的支撑。数据作为新型生产要素&#xff0c;具有非消耗性、非竞争性等特征&#xff0c;为突破传统生产要素的增长约束提…

【LeetCode:LCR 077. 排序链表 + 链表】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

Bpmn.js使用(仅查看版)

Bpmn.js使用&#xff08;仅查看版&#xff09; 下载 npm install bpmn-js创建一个 Dom 节点来挂载画布元素。 <a-tabs v-model:activeKey"activeKey" change"tabsChange"><a-tab-pane key"1" tab"审批记录"><a-tabl…

Spring添加注解读取和存储对象

5大注解 Controller 控制器 Service 服务 Repository 仓库 Componet 组件 Configuration 配置 五大类注解的使用 //他们都是放在同一个目录下&#xff0c;不同的类中 只不过这里粘贴到一起//控制器 Controller public class UserController {public void SayHello(){System.ou…

第十二届蓝桥杯省赛真题 Java C 组【原卷】

文章目录 发现宝藏【考生须知】试题 A: ASC试题 B: 空间试题 C: 卡片试题 D: 相乘试题 E: 路径试题 F: 时间显示试题 G: 最少砝码试题 H : \mathrm{H}: H: 杨辉三角形试题 I: 左孩子右兄弟试题 J : \mathrm{J}: J: 双向排序 发现宝藏 前些天发现了一个巨牛的人工智能学习网站…

Spring如何控制Bean的加载顺序

前言 正常情况下&#xff0c;Spring 容器加载 Bean 的顺序是不确定的&#xff0c;那么我们如果需要按顺序加载 Bean 时应如何操作&#xff1f;本文将详细讲述我们如何才能控制 Bean 的加载顺序。 场景 我创建了 4 个 Class 文件&#xff0c;分别命名为 FirstInitialization Se…

国家软考办:2024年上半年软考考试安排

按照《2024年计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试工作安排及有关事项的通知》&#xff08;计考办〔2024〕1号&#xff09;文件精神&#xff0c;结合各地机位实际&#xff0c;现将2024年上半年计算机软件资格考试有关安排通告如下&#xff1a; 一、考…

代码随想录算法训练营第36期DAY19

DAY19 104二叉树的最大深度 根节点的高度就是最大深度。 非递归法&#xff1a; /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) …

Maven的使用

1.第一个Maven工程 1.1 创建约定目录结构 ​ Hello ​ src ​ ——main(存放主程序) ​ ————java(存放源代码文件) ​ ————resources(存放配置文件和资源文件) ​ ——test(存放测试程序) ​ ————java ​ ————resources ​ pom.xml 1.2 创建核心文件 pom.xml …

知识竞赛奖品买什么好,不是贵的就好

知识竞赛奖品分精神奖品和物质奖品两种&#xff0c;两种缺一不同&#xff0c;精神奖品主要是荣誉证书和奖牌或奖杯之类&#xff0c;满足选手精神需要&#xff0c;另外&#xff0c;物质奖品也不可以少&#xff0c;否则选手没有参与积极性&#xff0c;物质奖品可以是奖金或奖品&a…
最新文章