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

接着做

3、为指示器设计合适的模型:

新建MyLamp.py,代码如下:

from PyQt5.QtWidgets import QLabelclass MyLamp(QLabel):def __init__(self, parent=None):super().__init__(parent)self.rad = Noneself.blink = Falseself.normal_style = Noneself.style = ''self.off_color = ''self.on_color = ''self.border_color = ''self.lamp = None# self.cal_rad()# self.last = ''def init(self, isRound=True, off_color='#767676', on_color='#039806',border_color='#868686'):  # 在部件初始化的时候运行一次if isRound:self.rad = str(round(self.width() / 2))else:self.rad = 2self.off_color = off_color  # 默认off颜色self.on_color = on_color  # 默认on颜色self.border_color = border_color  # 默认的边框颜色def set_color(self, color):  # 设置自定义的颜色# self.cal_rad()self.style = f'border-radius:{self.rad}px;background-color:{color};border:1px solid {self.border_color}; 'if not self.blink:self.setStyleSheet(self.style)def set_blink(self):  # 启动闪烁self.style = self.styleSheet()self.blink = Truedef reset_blink(self):  # 停止闪烁self.blink = Falseself.setStyleSheet(self.style)def blinker(self, color1, color2, bool_in):  # 执行闪烁if not self.blink:return Falseif bool_in:self.setStyleSheet(f'border-radius:{self.rad} px;background-color:  {color1}')else:self.setStyleSheet(f'border-radius:{self.rad} px;background-color:  {color2}')def color_on_bool(self, bool_in):  # 由输入的bool来控制颜色的显示,默认为on:绿色,off:灰色if bool_in:self.style = f'border-radius:{self.rad}px;background-color:{self.on_color}; border:1px solid {self.border_color};'else:self.style = f'border-radius: {self.rad}px;background-color:{self.off_color}; border:1px solid {self.border_color};'self.setStyleSheet(self.style)def color_on_bit(self, bytes_in, n):  # 由输入的字的某一位l来控制颜色的显示,默认为on:绿色,off:灰色if bytes_in >> n & 1:self.style = f'border-radius: {self.rad}px;background-color:{self.on_color}; border:1px solid {self.border_color};'else:self.style = f'border-radius:{self.rad} px;background-color:{self.off_color}; border:1px solid solid {self.border_color};'self.setStyleSheet(self.style)

打开Qt设计师,将MyLamp加入“提升的窗口部件”,并将几个指示器全部“提升为”MyLamp”。

4、至此,所有的子部件都已经创建完毕。现在创建容器部件(父部件):

        新建MySelectorBox.py,代码如下:

# 自定义的多选一选择器
from PyQt5.QtWidgets import QGroupBox, QLabel, QWidget
from PyQt5.Qt import pyqtSignalclass MySelectorBox(QGroupBox):def __init__(self, parent=None):super().__init__(parent)self.start_on = 0  # 初始为on的序号self.controls = []  # 所有的控制器self.states = []  # 所有的状态指示器def init(self):  # 需要在部件初始化的时候运行一次_ = self.findChildren(QWidget)   # 查找子部件        for i in range(len(_)):  # 查找子部件n = _[i].objectName().find('_control')  # 子部件的名称是‘_control’if n != -1:t = f'self.control{_[i].objectName()[n + 8]}'exec(f'{t} = _[{i}]')  # 将控制器的变量定义映射到查找到的对应子部件,这里最多可以有10个控制器,如果超过10个,需要修改程序exec(f'self.controls.append({t})')continuen = _[i].objectName().find('_state')  # 子部件的名称是‘_state’if n != -1:t = f'self.state{_[i].objectName()[n + 6]}'exec(f'{t}  = _[{i}]')  # 将指示器的变量定义映射到查找到的对应子部件,这里最多可以有10个指示器,如果超过10个,需要修改程序exec(f'self.states.append({t})')self.controls.sort(key=lambda child: child.objectName())   # 根据名称排序self.states.sort(key=lambda child: child.objectName())   # 根据名称排序# for _ in self.controls:#     try:#         _.init()#     except AttributeError:#         continue# for _ in self.states:#     try:#         _.init()#     except AttributeError:#         continueself.connect()   # 信号的连接def connect(self):   # 信号的连接for i in range(len(self.controls)):def callback(idx):return lambda: self.toggle_states(idx)self.controls[i].clicked.connect(callback(i))def toggle_states(self, n):  # 切换指示器的显示状态for i in range(len(self.states)):if i == n:self.states[i].set_color(self.states[i].on_color)  # 点亮对应的指示器else:self.states[i].set_color(self.states[i].off_color)  # 熄灭对应的指示器

 打开Qt设计师,将MySelectorBox加入“提升的窗口部件”,并将_selector_1“提升为”MySelectorBox“。

5、修改主程序,代码如下:

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._selector_1.init()form0._selector_1.control0.init()form0._selector_1.control1.init()# form0._selector_1.control2.init()form0._selector_1.control2.init(style_enter='border:1px solid  #868686;border-radius:2px;background-color: rgba(194, 56, 37, 200);')  # 控制器的control2需要单独定义form0._selector_1.state0.init()form0._selector_1.state1.init()form0._selector_1.state2.init()form0.show()exit(app.exec_())

运行截图:

至此,组合部件的建设基本完成。

如果需要多个相同的组合部件,只需要再Qt设计师里面简单的复制粘贴即可。例如,三个相同的选择器:将第一个选择器简单复制粘贴即可。

然后在主程序中增加另外两个选择器的初始化代码 :

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._selector_1.init()form0._selector_1.control0.init()form0._selector_1.control1.init()# form0._selector_1.control2.init()form0._selector_1.control2.init(style_enter='border:1px solid  #868686;border-radius:2px;background-color: rgba(194, 56, 37, 200);')  # 控制器的control2需要单独定义form0._selector_1.state0.init()form0._selector_1.state1.init()form0._selector_1.state2.init()form0._selector_2.init()form0._selector_2.control0.init()form0._selector_2.control1.init()form0._selector_2.control2.init()form0._selector_2.state0.init()form0._selector_2.state1.init()form0._selector_2.state2.init()form0._selector_3.init()form0._selector_3.control0.init()form0._selector_3.control1.init()form0._selector_3.control2.init()form0._selector_3.state0.init()form0._selector_3.state1.init()form0._selector_3.state2.init()form0.show()exit(app.exec_())

运行截图:

 可以看到,主程序中仍然必须有每一个部件的init()语句,所以,下一步的任务就是要把部件的init()语句自动或半自动隐式执行。

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

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

相关文章

兰州大学漏洞报送证书

获取来源:edusrc(教育漏洞报告平台) url:https://src.sjtu.edu.cn/ 兑换价格:30金币 获取条件:提交兰州大学任意中危或以上级别漏洞 证书规格:附送图二图三实物及封皮
老实来讲兰州大学算是…

Chrome插件精选 — 屏幕录像插件

Chrome实现同一功能的插件往往有多款产品,逐一去安装试用耗时又费力,在此为某一类型插件挑选出比较好用的一款或几款,尽量满足界面精致、功能齐全、设置选项丰富的使用要求,便于节省一个个去尝试的时间和精力。 1. 屏幕录像机 - S…

win7电脑怎么录屏?教你一键捕捉电脑屏幕

在Win7操作系统中,录制屏幕活动是一项重要且有用的功能。不仅可以用于制作教程和演示文稿,还可以用于记录游戏过程或视频会议。可是win7电脑怎么录屏呢?在本文中,我们将介绍三种流行的Win7电脑录屏方法。通过本文,您将…

地表水与地下水耦合丨基于QSWATMOD的SWAT-MODFLOW模拟丨模型率定丨案例分析

耦合模型被应用到很多科学和工程领域来改善模型的性能、效率和结果,SWAT作为一个地表水模型可以较好的模拟主要的水文过程,包括地表径流、降水、蒸发、风速、温度、渗流、侧向径流等,但是对于地下水部分的模拟相对粗糙,考虑到SWAT…

怎么学编程效率高,编程练习网站编程软件下载,中文编程开发语言工具下载

怎么学编程效率高,编程练习网站编程软件下载,中文编程开发语言工具下载 给大家分享一款中文编程工具,零基础轻松学编程,不需英语基础,编程工具可下载。 这款工具不但可以连接部分硬件,而且可以开发大型的…

判断两个对象是否不相等operator.ne()

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 判断两个对象是否不相等 operator.ne() 选择题 下列代码执行输出的结果是? import operator print("【执行】operator.ne(8,8)") print(operator.ne(8,8)) print("【执行】…

数据结构与算法—双链表

前言 前面有很详细的讲过线性表(顺序表和链表),当时讲的链表以单链表为主,但在实际应用中双链表有很多应用场景,例如大家熟知的LinkedList。 双链表与单链表区别 单链表和双链表都是线性表的链式实现,它们的主要区别在于节点结构…

Java快速排序算法、三路快排(Java算法和数据结构总结笔记)[7/20]

一、什么是快速排序算法 快速排序的基本思想是选择一个基准元素(通常选择最后一个元素)将数组分割为两部分,一部分小于基准元素,一部分大于基准元素。 然后递归地对两部分进行排序,直到整个数组有序。这个过程通过 par…

[java进阶]——方法引用改写Lambda表达式

🌈键盘敲烂,年薪30万🌈 目录 📕概念介绍: ⭐方法引用的前提条件: 1.引用静态方法 2.引用构造方法 ①类的构造: ②数组的构造: 3.引用本类或父类的成员方法 ①本类&#xff1…

Databend 开源周报第 118 期

Databend 是一款现代云数仓。专为弹性和高效设计,为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务:https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展,遇到更贴近你心意的 Databend 。 MERGE INTO 现已…

电脑发热发烫,具体硬件温度达到多少度才算异常?

环境: 联想E14 问题描述: 电脑发热发烫,具体硬件温度达到多少度才算异常? 解决方案: 电脑硬件的温度正常范围会因设备类型和使用的具体硬件而有所不同。一般来说,以下是各种硬件的正常温度范围: CPU:正…

安装node-sass安装失败(Failed at the node-sass@4.14.1 postinstall script.)

npm i安装依赖,安装node-sass失败 全局设置淘宝镜像,还是下载不下来。下载不下来可能是因为默认从github上去下载node-sass,而国内经常连不上或者网络不好。可以单独下载 npm i node-sass4.14.1 --sass_binary_sitehttps://npm.taobao.org/…