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

news2024/11/23 22:17:08

接着做

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

新建MyLamp.py,代码如下:

from PyQt5.QtWidgets import QLabel


class MyLamp(QLabel):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.rad = None
        self.blink = False
        self.normal_style = None
        self.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 = 2
        self.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 = True

    def reset_blink(self):  # 停止闪烁
        self.blink = False
        self.setStyleSheet(self.style)

    def blinker(self, color1, color2, bool_in):  # 执行闪烁
        if not self.blink:
            return False
        if 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 pyqtSignal


class 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})')
                continue
            n = _[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:
        #         continue

        self.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, QWidget

if __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, QWidget

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

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

相关文章

Vue2基础-Vue对象介绍

文章目录 一、概念特点举例 二、模板语法插值语法指令语法v-bind数据绑定 三、组件el和data的两种写法 四、MVVM模型五、数据代理六、事件处理基本使用事件修饰符键盘按键 七、计算属性八、监听属性普通监视深度监视监视简写 九、监听与计算总结 一、概念 一套用于构建用户界面…

iview实现table里面每行数据的跳转

我的需求是跳转到第三方网站&#xff0c;看官方是写了如何跳转站内路由&#xff0c;不符合我的要求&#xff0c;在csdn发现了一篇文章&#xff0c;我贴一下代码 <template><Table border :columns"ReportColumns" :data"ReportData"><templ…

利用Ansible实现批量Linux服务器安全配置

1.摘要 在上一篇<<初步利用Ansible实现批量服务器自动化管理>>文章中, 我初步实现了通过编写清单和剧本来实现多台服务器的自动化管理,在本章节中, 我将利用Ansible的剧本来实现更实用、更复杂一点的功能, 主要功能包括三个:1.同时在三台服务器中增加IP访问控制,只…

黑洞路由的几种应用场景

第一种在内网中产生环路&#xff1a; 这种核心交换机上肯定写一条默认路由 0.0.0.0 0 10.0.0.1 出口路由要写一条192.168.0.0 16 10.0.0.2 如果出口路由访问一条不存在的内网网段&#xff0c;又或者访问的那台终端停机了&#xff0c;那就会产生三层环路&#xff0c;数据包在…

Linux常用命令——cat命令

在线Linux命令查询工具 cat 连接文件并打印到标准输出设备上 补充说明 cat命令连接文件并打印到标准输出设备上&#xff0c;cat经常用来显示文件的内容&#xff0c;类似于下的type命令。 注意&#xff1a;当文件较大时&#xff0c;文本在屏幕上迅速闪过&#xff08;滚屏&am…

12 tcp协议详解

1、tcp的本性 tcp是一个悲观者&#xff0c;生下来就不信任网络&#xff0c;任务会发生丢包等&#xff0c;所以要从算法层面来保证可靠性。 2、TCP 包头格式 tcp的包头格式比UDP要复杂的多。 1.源端口号和目标端口号是不可少的&#xff0c;这一点和 UDP 是一样的。如果没有…

ICCV 2023|PViC:构建交互谓词视觉上下文,高效提升HOI Transformer检测性能

文章链接&#xff1a;https://arxiv.org/abs/2308.06202 代码仓库&#xff1a;https://github.com/fredzzhang/pvic 在今年的计算机视觉顶会上&#xff0c;基于视觉Transformer&#xff08;ViT&#xff09;的工作仍然占有非常重要的地位。目前最受研究者青睐的&#xff0c;莫过…

JVM Native内存泄露的排查分析(64M 问题)

我们有一个线上的项目&#xff0c;刚启动完就占用了使用 top 命令查看 RES 占用了超过 1.5G&#xff0c;这明显不合理&#xff0c;于是进行了一些分析找到了根本的原因&#xff0c;下面是完整的分析过程&#xff0c;希望对你有所帮助。 会涉及到下面这些内容 Linux 经典的 64M…

2023最新版Android逆向教程——第4天:真机环境的配置

目录 一、安卓逆向设备推荐二、真机环境配置(刷机基础教程)2.1 刷机方式的分类2.2 刷机包的分类2.3 谷歌手机工厂镜像2.4 简单配置2.5 进入 Bootloader 模式2.6 刷机详解 二、真机环境配置(root)三、真机环境配置(其他)3.1 调整时间3.2 关闭 wifi 信号上的3.3 停用设置向导 安卓…

HBase基础编程

文章目录 HBase基础编程一、实验目标二、实验要求及注意事项三、实验内容及步骤 附&#xff1a;系列文章 HBase基础编程 一、实验目标 掌握如何通过HBase shell命令来设计HBase表结构实例&#xff0c;从而理解HBase的列式存储结构掌 握 java编程创建HBase表和删除HBase表。 …

新能源汽车高压线束是如何快速连接到测试设备上进行电性能测试的

快速连接形成稳定的电测试在新能源行业里面是很常见的测试场景&#xff0c;比如说在新能源汽车行业的电池包、电机、电控制器的电性能测试中会有很多高压线束&#xff0c;需要将这些线束和电池包、电控制器、电机与测试设备快速连接在一起进行相关的EOL/DCR测试。 新能源汽车高…

内网隧道搭建( 内网穿透)

一、使用代理工具 ew_for_win 1、环境准备&#xff1a; &#xff08;1&#xff09;一台双网卡虚拟机&#xff08;作为跳板&#xff09;&#xff0c;能同时与攻击者主机和受害者主机通信&#xff1a; &#xff08;2&#xff09;一台攻击者主机&#xff1a; &#xff08;3&…

【陈老板赠书活动 - 17期】- 她以亲身经历证明,程序员借助AI做副业可以有多成功!

陈老老老板&#x1f9b8; &#x1f468;‍&#x1f4bb;本文专栏&#xff1a;赠书活动专栏&#xff08;为大家争取的福利&#xff0c;免费送书&#xff09; &#x1f468;‍&#x1f4bb;本文简述&#xff1a;生活就像海洋,只有意志坚强的人,才能到达彼岸。 &#x1f468;‍&am…

最新Next14 路由处理器 Route Handlers

四、使用Next路由处理程序 Next.js Route Handlers I. Next中路由处理程序是什么 ​ 路由处理程序是在用户访问站点路由时执行的功能。它们负责处理对定义的URL或路由的传入HTTP请求&#xff0c;以生成所需的数据。从本质上讲&#xff0c;当用户访问Next.js应用程序中的特定页…

全新智能后备保护器综合产品解决方案

SCB后备保护器是一种用于浪涌保护器&#xff08;SPD&#xff09;的专用外置脱离器&#xff0c;它可以有效地防止SPD因故障或短路而引起的火灾和设备损坏&#xff0c;同时保证SPD在雷电流冲击下不误动作&#xff0c;维持电气设备的防雷保护状态。地凯科技将介绍后备保护器的应用…

pycharm remote host显示nothing to show

远程服务器remote host右侧消失解决方法_dl_风禾的博客-CSDN博客文章浏览阅读727次。remote host打开方法https://blog.csdn.net/weixin_43959436/article/details/127818707?ops_request_misc%257B%2522request%255Fid%2522%253A%2522169940685316800197099235%2522%252C%252…

软件开发项目文档系列之十三如何撰写用户操作手册

目录 1 引言1.1 目的1.2 系统概述1.3 参考资料1.4 文档格式 2 系统运行环境2.1 系统硬件环境2.2 系统软件环境 3 系统设置说明3.1 公告发布3.2 角色管理3.3 通用管理 4 用户账户与访问说明4.1 注册与登录4.2 密码管理 5 数据管理说明5.1 数据导入与导出5.2 数据备份与还原 6 帮…

二维码智慧门牌管理系统升级解决方案:高效、安全、便捷

文章目录 前言一、用户管理二、菜单管理三、角色管理四、字典管理五、权限管理六、日志管理 前言 随着科技的不断发展&#xff0c;传统门牌管理系统已经无法满足现代管理的需求。为了提高管理效率&#xff0c;降低安全风险&#xff0c;并实现便捷的日志管理&#xff0c;二维码…

JAVA综合知识点总结-基础篇(4)

三十一、平时浏览的书籍..................................................................................... 三十二、java Exception体系结构......................................................................... 三十三、session和cookie的区别...........…

小白学爬虫:通过商品ID或商品链接封装接口获取淘宝商品销量数据接口|淘宝商品销量接口|淘宝月销量接口|淘宝总销量接口

淘宝商品销量接口是淘宝开放平台提供的一种API接口&#xff0c;通过该接口&#xff0c;商家可以获取到淘宝平台上的商品销量数据。使用淘宝商品销量接口的步骤如下&#xff1a; 1、在淘宝开放平台注册并创建应用&#xff0c;获取API Key和Secret Key等必要的信息。 2、根据淘宝…