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

news2024/12/23 17:54:53

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

        之所以做这个组合部件,而不用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 pyqtSignal


class MyLabel(QLabel):  # 自定义的Qlabel
    Entry = pyqtSignal()  # 鼠标进入
    Leave = pyqtSignal()  # 鼠标离开
    clicked = pyqtSignal()  # 鼠标点击
    Release = pyqtSignal()  # 鼠标释放

    def __init__(self, parent=None):
        super(MyLabel, self).__init__(parent)
        self.style_normal = None
        self.style_last = None
        self.style_on = None
        self.style_enter = None
        self.style_clicked = None
        self.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  # 常态style
        self.style_enter = style_enter  # 鼠标悬停后的style
        self.style_clicked = style_clicked  # 鼠标点击后的style
        self.style_on = style_on

    def 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):  # 重新定义鼠标释放事件mouseReleaseEvent
        self.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, QWidget

if __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.coloradmin.cn/o/1181763.html

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

相关文章

DevChat:开源AI编程助手的全面解析

🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 &a…

【场景方案】前端如何结合GPT提升我们的开发效率,个人经验总结,不定期更新~

文章目录 AI模型的选择提问的方式很重要心里建设提问方法论设立角色从总体到局部步骤拆分,循序渐进举例子说明主动让他联系上文不要太纠结提问的方式 网址推荐尾巴 不说废话,没有铺垫,直接开始讲重点 AI模型的选择 首先咱们要选择一个适合的…

3-知识补充-HTTP协议

3-知识补充-HTTP协议 文章目录 3-知识补充-HTTP协议HTTP协议基础什么是HTTP?HTTP协议的会话方式HTTP1.0和HTTP1.1的区别 请求和响应报文报文的格式报文解析实例-请求百度官网请求报文-GET请求请求报文-POST请求-学习用-非请求百度官网响应报文 响应状态码有代表性的…

第八章认识Express框架

目录 Express模块化路由 基本概述 基本使用 基本构建 案例项目 Express接收请求参数 基本概述 基本类别 Express接收GET请求参数 Express接收POST请求参数 Express接收路由参数 Express模块化路由 基本概述 在Express中,路由是指确定应用程序如何响应对…

功率放大器的工作原理及选购技巧

功率放大器是电子设备中非常重要的组成部分之一,它的主要功能是将输入信号的功率进行放大,以驱动高功率负载。在各种应用领域中,如音频放大器、无线电频率放大器、射频功率放大器等,功率放大器都发挥着非常重要的作用。下面将介绍…

Kubernetes二进制搭建

目录 一、K8S的架构 二、K8S创建Pod资源的工作流程 三、K8S资源对象和资源配置信息 K8S资源对象 K8S资源配置信息 四、K8S的的三种网络和三种接口 三种网络: 三种节点: 五、etcd 集群 etcd 的特点: 六、flannel flannel方案 K8S …

指令手册术语缩写

指令手册术语缩写 1 指令汇总表中的操作码列(不带VEX前缀的指令)2 指令汇总表中的操作码列(带有VEX前缀的指令)3 操作码汇总表中的指令列 本文属于《 X86指令基础系列教程》之一,欢迎查看其它文章。 1 指令汇总表中的操作码列(不带VEX前缀的指令) 2 指令汇总表中的…

阿里云安全恶意程序检测(速通三)

阿里云安全恶意程序检测 特征工程进阶与方案优化pivot特征构建pivot特征pivot特征构建时间pivot特征构建细节特点 业务理解和结果分析结合模型理解业务多分类问题预测结果分析 特征工程进阶基于LightGBM模型验证模型结果分析模型测试 优化技巧与解决方案升级内存管理控制加速数…

【配置】如何在打包Spring Boot项目时按需使用日常、测试、预发、正式环境的配置文件

文章目录 前言1. 创建5个配置文件2. 在pom.xml文件中如下配置3. 在application.properties中加入环境变量 前言 在我们开发项目的时候,一般有四套环境:日常、测试、预发、正式。日常环境作为我们开发环境;测试环境给测试同学测试功能&#x…

基于厨师算法的无人机航迹规划-附代码

基于厨师算法的无人机航迹规划 文章目录 基于厨师算法的无人机航迹规划1.厨师搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要:本文主要介绍利用厨师算法来优化无人机航迹规划。 1.厨师搜索算法 …

Canal同步Mysql数据到ES以及Springboot项目查询ES数据

1、环境准备 服务器:Centos7 Jdk版本:1.8 Mysql版本:5.7.44 Canal版本:1.17 Es版本:7.12.1 kibana版本:7.12.1 软件包下载地址:链接:https://pan.baidu.com/s/1jRpCJP0-hr9aI…

C++进阶篇4---番外-AVL树

一、AVL树的概念 二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查 找元素相当于在顺序表中搜索元素,效率低下。因此,两位俄罗斯的数学家G.M.Adelson-Velskii 和E.M.Landis在1962年发明了一…

Microsoft Dynamics 365 CE 扩展定制 - 8. DevOps

在本章中,我们将介绍以下内容: 使用PowerShell导出Dynamics 365解决方案使用PowerShell部署解决方案构建解决方案层次结构修补解决方案暂存解决方案使用SolutionPackager在源代码管理中保存解决方案使用PackageDeployer将您的解决方案与配置数据打包基于解决方案版本增量触发…

缓存-基础理论和Guava Cache介绍

缓存-基础理论和Guava Cache介绍 缓存基础理论 缓存的容量和扩容 缓存初始容量、最大容量,扩容阈值以及相应的扩容实现。 缓存分类 本地缓存:运行于本进程中的缓存, 如Java的 concurrentHashMap, Ehcache,Guava Cache。 分布式缓…

3.Netty中Channel通道概述

Selector 模型 Java NIO 是基于 Selector 模型来实现非阻塞的 I/O。Netty 底层是基于 Java NIO 实现的,因此也使用了 Selector 模型。 Selector 模型解决了传统的阻塞 I/O 编程一个客户端一个线程的问题。Selector 提供了一种机制,用于监视一个或多个 …

如何成为C++大神?五个技巧助你提升编程水平

一名优秀的C程序员是如何炼成的?这个问题一直困扰着许多人,尤其是那些刚刚踏入编程的世界的新手。C作为一门强大而复杂的编程语言,的确需要一些特殊的技巧和策略才能掌握。但幸运的是,成为一名出色的C程序员并不是不可能的任务。在…

【算法练习Day41】买卖股票的最佳时机买卖股票的最佳时机 II

​📝个人主页:Sherry的成长之路 🏠学习社区:Sherry的成长之路(个人社区) 📖专栏链接:练题 🎯长路漫漫浩浩,万事皆有期待 文章目录 买卖股票的最佳时机买卖股票…

办公神器!2024年值得拥有的10款在线画板软件!

随着科技的进步和互联网的普及,我们工作、学习和生活方式发生了翻天覆地的变化。在线画板软件就是在这个背景下应运而生的一种便捷工具。它不仅满足了我们随时随地绘制图像、演示思路的需求,还提供了协同编辑、云存储等功能,使得团队协作变得…

Java面试题(高频、有答案,全网最强)

原文网址:Java面试题(高频、有答案,全网最强)-CSDN博客 这是一套全网最强的Java面试题,吊打网上所有Java面试题。 此套面试题的威力:看过这套题的朋友、同事、粉丝参加了面试后说,他们面试被问…

基于C#的GRPC

GRPC gRPC(gRPC Remote Procedure Call)是由Google开发的高性能、跨语言的远程过程调用框架。它基于HTTP/2协议进行通信,支持多种编程语言,包括C, C#, Java, Python等,使不同语言的应用程序可以通过远程调用相互通信。…