pyqt5的组合式部件制作(一)

        以多选一的选择器为例,来实践一下工程实用级别的组合式部件设计。自己之前做的自定义的组合式部件,结构不够简单优化,在实际的工程里面,使用部件的过程比较繁琐。所以,这里来做一个优化的实验。

        之所以做这个组合部件,而不用Qt Designer自带的QRadioButton,是因为我不会修改自带的QRadioButton,无法改变它的指示器圆点尺寸和颜色,我希望实现一些自定义的特殊效果和功能。

        这个部件的特点是有着若干个相同品种的子部件,但不确定数量。子部件由两部分组成:控制器和指示器,“就地控制”、“远程控制”、“自动运行”这几个文字标签构成了控制器,后面的方框是指示器。当点击控制器,指示器做出颜色状态改变,并发射信号。

设计的目标:

        1、尽量在python程序里面不要手动逐个输入各个子部件的具体名称,因为当画面复杂时这将是一个很大的工作量。

        2、把部件做成模块,在Qt Designer里面可以简单ctrl+拖拽复制。

        3、当Qt Designer里面放置好部件以后,有简单的方法实现部件的自动或半自动初始化和特性定义。

过程记录:

        1、Qt Designer里面新建一个QGroupBox作为容器部件,三个纯文字QLabel作为控制器,三个圆角矩形QLabel作为指示器。各个部件命名如下:

父部件:_selector_1

子部件:_control0_selector_1:选择器0

               _control1_selector_1:选择器1

               _control2_selector_1:选择器2

               _state0_selector_1:指示器0

               _state1_selector_1:指示器1

               _state2_selector_1:指示器2

命名的规律:需要自动运行初始化的自定义的组合部件首字母为"_ ",用以和其他不用初始化部件区分开(例如固定内容的文字标签、装饰用的线条之类的);子部件的名称的前半部分是子部件的分类和编号,如control0,后半部分是容器部件的名字,如selector_1,从命名上就可以看出子部件的功能以及它属于哪个容器部件;容器部件的最后一位数字是顺序号,当需要多个相同的容器部件时,直接ctrl+拖拽复制,顺序号就会自动递增。

完成之后,将所有的子部件拖入容器部件,构成一个组合部件,如图:

至此,前端工作告一段落,开始后端的编程。 

2、自定义的QLabel

        由于默认的QLabel是不带鼠标事件的,需要自定义一下鼠标的进入、点击、释放、离开等各个事件。代码如下:

from PyQt5.QtWidgets import QLabel
from PyQt5.Qt import pyqtSignalclass MyLabel(QLabel):  # 自定义的QlabelEntry = pyqtSignal()  # 鼠标进入Leave = pyqtSignal()  # 鼠标离开clicked = pyqtSignal()  # 鼠标点击Release = pyqtSignal()  # 鼠标释放def __init__(self, parent=None):super(MyLabel, self).__init__(parent)self.style_normal = Noneself.style_last = Noneself.style_on = Noneself.style_enter = Noneself.style_clicked = Noneself.Entry.connect(lambda: self.set_style(self.style_enter))  # 鼠标进入后改变样式表self.clicked.connect(lambda: self.set_style(self.style_clicked))self.Release.connect(lambda: self.set_style(self.style_last))  # 鼠标释放后改变样式表self.Leave.connect(lambda: self.set_style(self.style_last))  # 鼠标离开后改变样式表def init(self, style_normal='color: rgb(0, 0, 0);background-color: rgba(255, 255, 255, 0);',style_enter='border:1px solid  #039806;border-radius:2px;background-color: rgba(194, 194, 194, 150);',style_clicked='border-radius:2px;background-color: rgba(194, 194, 194, 150);',style_on='border-radius:2px;background-color: #039806;border:2px solid  #868686;border-radius:2px;'):self.style_normal = style_normal  # 常态styleself.style_enter = style_enter  # 鼠标悬停后的styleself.style_clicked = style_clicked  # 鼠标点击后的styleself.style_on = style_ondef set_style(self, style):self.setStyleSheet(style)def mousePressEvent(self, event):  # 重写鼠标点击事件self.clicked.emit()  # 左单击def enterEvent(self, event):  # 重新定义鼠标悬停事件self.style_last = self.styleSheet()self.Entry.emit()def leaveEvent(self, event):  # 重新定义鼠标离开事件self.Leave.emit()def mouseReleaseEvent(self, event):  # 重新定义鼠标释放事件mouseReleaseEventself.Release.emit()

代码里面有两个初始化函数__init__和init,第一个是默认在后台自动运行的初始化,第二个是需要在主程序里面运行一次的初始化,第二个初始化的目的是可以灵活定义一些特性,比如同一个项目中需要有不同背景颜色的同类部件,就可以根据需要单独修改相对应的参数来实现。

将以上代码保存在主程序同文件夹下,并命名为MyLabel.py。

回到Qt Designer,打开之前的ui文件,在画面空白处点右键:

 填写类和头文件的名称,然后点“添加”:

 在三个控制器上分别点右键,提升为,将其提升为刚刚自定义的QLabel:

这样,控制器就基本完成了 。新建python文件,输入代码:

from PyQt5 import uic
from sys import exit, argv
from PyQt5.QtWidgets import QApplication, QWidgetif __name__ == '__main__':app = QApplication(argv)# 读取 UI 文件并转换为 Python 代码ui_file = '../UIS/test2.ui'   # 更换为实际的ui文件地址form0 = uic.loadUi(ui_file)   # 创建显示界面form0._control0_selector_1.init()     # 部件的初始化form0._control1_selector_1.init()form0._control2_selector_1.init(style_enter='border:1px solid  #868686;border-radius:2px;background-color: rgba(194, 56, 37, 200);')  # 控制器的control2需要单独定义form0.show()exit(app.exec_())

运行截图:

 可以看到,控制器control2由于采用了单独的init初始化参数,其显示效果是与默认的效果有区别的。这也正是自己制作部件的优势所在,你可以实现一些默认部件不具备的特殊效果和功能。

下一步的任务是继续定义容器部件和指示器部件,以及实现预期的功能。

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

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

相关文章

iOS实现代码混淆

iOS实现代码混淆 目录 前言 ipaguard界面概览 ipaguard启动界面 ipaguard代码混淆界面 资源文件混淆界面 重签名界面 前言 本文章向大家介绍iOS实现代码混淆,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值…

AR眼镜硬件解决方案_AR/VR智能眼镜安卓主板芯片方案介绍

随着近两年来增强现实(AR)技术的逐渐成熟,采用MT8788芯片解决方案的AR眼镜已经问世。众所周知,AR技术可以帮助开发者打造一个既强大而又实用的混合现实世界,将虚拟与真实世界相结合。 据了解,MT8788芯片采用了多芯片分布式处理系统…

软件测试-根据状态迁移图设计测试用例

测试用例状态迁移图 许多需求用状态机的方式来描述,状态机的测试主要关注状态转移是否正确。对于一个有限状态机,通过测试验证其在给定的条件内是否能够产生需要的状态变化,有没有不可达的状态和非法的状态,是否可能产生非法的状…

Modelsim 使用教程(5)——Analyzing Waveforms

一、概述 Wave窗口允许我们以HDL波形和数据的形式查看仿真结果。Wave窗口被划分为多个窗格。通过单击并在任意两个窗格之间拖动该条,可以调整路径名窗格、值窗格和波形窗格的大小。 二、加载一个设计(Loading a Design) 1、打开modelsim 2、…

HTTP 协议详解-上(Fiddler 抓包演示)

文章目录 HTTP 协议HTTP 协议的工作过程HTTP 请求 (Request)认识URL关于 URL encode认识 "方法" (method)GET 方法POST 方法其他方法请求 "报头" (header)请求 "正文" (body) HTTP 响应详解状态码响应 "报头" (header) HTTP 协议 HTT…

IP代理如何选择?4大误区你别踩!

近年来,我国互联网商业保持持续发展的状态大环境的优化,大大小小的企业都想乘胜追击,大展宏图,积极推动各项数据业务的进程。 而对于跨境业务来说,代理IP是不可或缺的重要工具之一,市面上代理IP类型众多&a…

开源项目管理工具Helper的安装及汉化

什么是 Helper ? Helper 是基于 Laravel 和 Filament 的开源项目管理工具。 官方提供了在线演示:https://project-helper.net 安装 在群晖上以 Docker 方式安装。 数据库理论上是可以使用群晖自带的 MariaDB 的,但老苏为了省事&#xff0c…

Linux中for循环

for do done 复习知识点:cut命令,id命令,finger命令,for循环 程序如上,-d 接分隔符,-f后的数字表示分隔后的列 从结果可以看出,系统上没有finger这个命令,后面会学到yum安装命令&a…

基于ssm的校园快递物流管理系统(java+jsp+ssm+javabean+mysql+tomcat)

博主24h在线,想要源码文档部署视频直接私聊,9.9拿走! 基于javawebmysql的ssm校园快递物流管理系统(javajspssmjavabeanmysqltomcat) 运行环境: Java≥8、MySQL≥5.7、Tomcat≥8 开发工具: eclipse/idea/myeclipse/s…

LabelImg使用笔记

LabelImg使用笔记 文章目录 LabelImg使用笔记一、LabelImg简介1.1、特性1.2、LabelImg的热键 二、LabelImg安装三、3种格式的使用3.1、VOC格式标注3.2、yolo格式标注3.3、json格式 四、LabelMe 和 LabelImg适用场景 一、LabelImg简介 LabelImg 是一个用于图像标注的开源工具&a…

Qt全局定义

一、QtGlobal头文件 头文件中包含了Qt类库的一些全局定义,包括: 基本数据类型全局函数宏定义 二、基本数据类型 三、全局函数 四、宏定义 1.Qt版本相关的宏 1.1 QT_VERSION 这个宏展开为数值形式 0xMMNNPP (MM major, NN minor, PP patch) 表示…

【漏洞复现】Django _2.0.8_任意URL跳转漏洞(CVE-2018-14574)

感谢互联网提供分享知识与智慧,在法治的社会里,请遵守有关法律法规 文章目录 1.1、漏洞描述1.2、漏洞等级1.3、影响版本1.4、漏洞复现1、基础环境2、漏洞扫描3、漏洞验证 1.5、修复建议 说明内容漏洞编号CVE-2018-14574漏洞名称Django任意URL跳转漏洞漏洞…