PyQt5-新手避坑指南(持续更新)

2024-05-28 01:20

本文主要是介绍PyQt5-新手避坑指南(持续更新),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 一.前言
  • 二.开发环境
  • 三.坑
    • 1.程序没有详细报错就退出了
    • 2.qrc资源文件的使用
    • 3.QLabel文字自动换行
    • 4.图片自适应大小
    • 5.checkbox自定义样式后✓不见了
    • 6.多线程
  • 四.记录


一.前言

本篇博客整理了一些初学者容易犯的错,将会持续更新解决PyQt5开发过程中的一些坑,对新手比较友好,大佬请绕道 /笑哭

二.开发环境

笔者是在Windows11上使用Pycharm配合Python3.8进行开发的,详细开发环境信息如下:

  1. 处理器:AMD Ryzen 7 7735H with Radeon Graphics 3.20 GHz
  2. 系统版本:Windows 11 家庭中文版
  3. 开发工具:PyCharm 2021.3
  4. Python版本:Python3.8
  5. PyQt5版本:PyQt5==5.15.10

三.坑

1.程序没有详细报错就退出了

代码执行时,直接报错Process finished with exit code - 1073740791 (Oxc0000409)然后就退出了。
在这里插入图片描述
按照下图指引打开“Emulate terminal in output console”
在这里插入图片描述
勾选后点击确定或应用
在这里插入图片描述
最新版本在这里插入图片描述

然后再执行代码,就能够看到详细报错信息了
在这里插入图片描述

2.qrc资源文件的使用

我们在设计师或者代码里使用的资源文件都统一地使用qrc管理,qrc是什么呢?

.qrc是一个XML文件,它允许开发者将应用程序所需的图像、样式表、声音文件等各种资源集中管理。
通过将资源文件.qrc加载到PyQt5应用程序中,开发者可以轻松地访问和使用这些资源。
.qrc文件使用XML格式编写,包含一个或多个元素。
每个元素内可以包含多个元素,每个元素指定一个资源的路径和名称。

我们这里有个例子,比如当前项目根目录有个名为logo.png的图片文件,我们想让QLabel显示这张图片,那么我们可以这么操作:

  1. 生成.qrc资源文件
  2. 将qrc通过rcc工具转为.py文件
  3. 在代码里使用资源

resources.qrc
在这里插入图片描述

demo.py
虽然第一步引入代码是灰色,但是不影响使用
在这里插入图片描述
有的同学可能会问,我直接写成**self.setPixmap(QPixmap(“logo.png”))**不也能使用资源么?我们这么写的目的是为了打包方便,当资源用多了就能体现得到。

3.QLabel文字自动换行

这个很好解决,一行代码

label.setWordWrap(True)

4.图片自适应大小

让我们的QLabel随着父控件的大小变化
这个很好解决,一行代码

label.setScaledContents(True)

5.checkbox自定义样式后✓不见了

当我们自定义了QCheckBox之后,发现左侧勾选区域的对号不见了,这通常是我们重写了QCheckBox::indicator::unchecked这很影响我们的ui,其实一张图片即可解决,在此我给出定义样式的qss:

#QCheckBox{color:rgb(44,206,162);font-size:11pt;font-weight:520;}
#QCheckBox::indicator::unchecked{ width: 12px;  height: 12px;  border: 1px solid rgb(44,206,162);background-color:rgb(44,206,162)}
#QCheckBox::indicator::checked{ width: 12px;  height: 12px;image:url(:res/tick.png);border: 1px solid rgb(44,206,162);background-color:rgb(44,206,162)}

这里我们需要一张:res/tick.png图片作为勾选后的样式,图片是用qrc转的。
tick.png下载地址:https://wwt.lanzoul.com/iwu9u1zxiehe

大致效果如下图:
在这里插入图片描述

6.多线程

这个问题对于新手来说可能不会涉及到,但是随着代码量和需求的叠加,难免会遇到这个问题:主线程(UI线程)耗时太久导致整个界面卡顿甚至卡死,在此我提供一种方案,就是多线程,但是多次的重写QThread会徒增代码量,我给出一种方案解决:

class WorkerThread(QThread):calc_finished = pyqtSignal(dict)def __init__(self, task, *arg, **args):super(WorkerThread, self).__init__()self.arg = argself.args = argsself.task = taskdef run(self):result = self.task(self, *self.arg, **self.args)def do_calc(self, **args):data=dict()try:data=xxx()except:traceback.print_exc()self.calc_finished .emit(data)

代码大致思路是创建一个线程类,里面通过定义不同的函数执行耗时操作,当耗时操作执行完毕后,使用“发射信号”的方式,将数据传递回主线程。

四.记录

本文会持续更新,大家点赞不迷路哈~

2024年5月27日更新1-6

这篇关于PyQt5-新手避坑指南(持续更新)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1009143

相关文章

PS的一些操作~持续抄袭中....

套索工具使用时移动图片——按住空格键,鼠标左键按住,拖动!

打造坚固的SSH防护网:端口敲门入门指南

欢迎来到我的博客,代码的世界里,每一行都是一个故事 🎏:你只管努力,剩下的交给时间 🏠 :小破站 打造坚固的SSH防护网:端口敲门入门指南 前言什么是端口敲门端口敲门的优点1. 增强安全性2. 动态防火墙规则3. 隐匿服务4. 改善日志管理5. 灵活性和兼容性6. 低资源消耗7. 防御暴力破解和扫描8. 便于合法用户访问9. 适用于不同类型的服务 端口敲

个人博客文章目录索引(持续更新中...)

文章目录 一、Java基础二、Java相关三、MySql基础四、Mybatis基础及源码五、MybatisPlus基础六、Spring基础及源码七、Tomcat源码八、SpringMVC基础及源码   随着文章数量多起来,每次着急翻找半天,而是新申请的域名下来了,决定整理下最近几年的文章目录索引。(红色标记为常检索文章) 一、Java基础 1、Java基础(一):语言概述2、J

Chromium 调试指南2024 - 远程开发(下)

1. 引言 在《Chromium 调试指南2024 - 远程开发(上)》中,我们探讨了远程开发的基本概念、优势以及如何选择合适的远程开发模式。掌握了这些基础知识后,接下来我们将深入了解如何在远程环境中高效地进行Chromium项目的调试工作。 调试是开发过程中至关重要的一环,特别是对于像Chromium这样复杂的大型项目。远程调试不仅可以充分利用远程服务器的强大计算资源,还能确保开发环境的一致

python3GUI--ktv点歌软件By:PyQt5(附下载地址)

文章目录 一.前言二.展示1.启动2.搜索2.服务1.首页2.天气预报3.酒水饮料4.酒水饮料2 3.服务4.灯光5.调音6.排行榜7.分类点歌9.歌手点歌10.歌手个人页 三.心得体会1.关于代码2.关于设计3.关于打包 四.总结 文件大小:33.13M https://wwt.lanzoul.com/iikRv22iqmpg 如果安装后打不开,多半是权限问题,请使用管理

手把手带你实现Android增量更新

Android增量更新技术在很多公司都在使用,网上也有一些相关的文章,但大家可能未必完全理解实现的方式,本篇博客,我将一步步的带大家实现增量更新。 为什么需要增量更新? 当我们开发完一个项目之后,上线维护 , 增加新功能 , 添加第三方库 , APK大小从4 - 5M , 增长到10+M , 用户由原来的几十秒下载 , 到现在几分钟以上的下载 , 网络情况不好的时候 , 或许就是十分钟不等。每

在Qt5中创建、读取和写入JSON文件的完整指南

Qt5 提供了一个非常方便的JSON解析器,使得在C++中处理JSON数据变得非常简单。本文将详细介绍如何在Qt5中创建、读取和写入JSON文件。 读取JSON文件的示例 假设我们有一个名为test.json的JSON文件,内容如下: {"appDesc": {"description": "SomeDescription","message": "SomeMessage"},"appNam

写给Android开发的Binder指南

为什么选用binder? Linux 已经提供了管道、消息队列、共享内存和 Socket 等 IPC 机制。那为什么 Android 还要提供 Binder 来实现 IPC 呢?主要是基于性能、稳定性和安全性几方面的原因。 性能 Socket 作为一款通用接口,其传输效率低,开销大,主要用在跨网络的进程间通信和本机上进程间的低速通信。 消息队列和管道采用存储-转发方式,即数据先从发送方缓存区拷

华为欧拉 openEuler24.03 更新 阿里 yum源

华为欧拉 openEuler24.03 更新 阿里 yum源 备份 yum 源编写 阿里云 yum源 配置文件更新 yum 缓存 备份 yum 源 mv /etc/yum.repos.d/openEuler.repo /etc/yum.repos.d/openEuler.repo.bak 编写 阿里云 yum源 配置文件 vim /etc/yum.repos.d/openEuler.r

git 放弃本地修改 强制更新

git fetch --all git reset --hard origin/分支名称 git fetch 只是下载远程的库的内容,不做任何的合并 git reset 把HEAD指向刚刚下载的最新的版本