pyside6自定义部件库和软件框架的建设记录

news2025/6/3 21:18:39

自定义的部件库原则上尽量做到前后端分离,接口方便,复制简单。

单选框部件

# encoding: utf-8
###################################################
#               自定义的单选框
###################################################

# 对外接口:
# stateNum = Signal(int)  状态号,从1开始,是几就几被选中
# customSetup():   # 定制的初始化程序


import PySide6
from PySide6.QtCore import Signal
from PySide6.QtWidgets import QWidget, QGroupBox, QFrame


class PysideCustomRadiobutton(QFrame):
    stateNum = Signal(int)    # 状态号,从1开始,是几就几被选中

    def __init__(self, parent=None):
        super().__init__(parent)
        self.RadioButtons = []

    def customSetupUi(self):   # 定制的初始化程序
        self.RadioButtons = self.findChildren(PySide6.QtWidgets.QRadioButton)   # 部件中所有的单选按钮
        self.RadioButtons.sort(key=lambda child: child.objectName())    # 按名称排序

        for i in range(len(self.RadioButtons)):
            def callback(idx):
                return lambda: self.stateNum.emit(idx+1)
            self.RadioButtons[i].clicked.connect(callback(i))     # 单击按钮后发射信号

        self.stateNum.connect(self.changeState)                   # 状态号信号的连接

        self.stateNum.emit(1)                                     # 初始化状态下,状态1被选中

    def changeState(self, thisTurnOn):    # 改变状态
        self.RadioButtons[thisTurnOn-1].setChecked(True)




前端的范例: 

框架的建立和调用

# 阶段v1的调用
import sys
from time import strftime

from PySide6.QtCore import QObject, Signal, QTimer
from PySide6.QtWidgets import QWidget, QApplication, QMainWindow
import template_rc  # 导入需要显示的画面


# ############导入并需要显示的画面集中在这里定义#############################
# ############template.ui的显示#############################
class MainWindow(QMainWindow, template_rc.Ui_MainWindow):  # 定义需要显示的画面类
    def __int__(self):
        super().__init__()


# ########################部件初始化的通用函数###################################
def init_widgets(widget):  # 画面里的部件的初始化
    sons = widget.children()  # 儿辈部件

    def find_child(child):  # 查找子部件
        try:
            child.customSetupUi()  # 自定义的初始化
        except AttributeError:
            pass

        if child.children():
            for grandson in child.children():
                find_child(grandson)  # 递归查找

    for son in sons:
        find_child(son)


# #############################主程序###################################
if __name__ == '__main__':
    app = QApplication(sys.argv)

    # #######################本项目的定义###################################
    class UI(QObject):
        # ##########项目范围内的信号#############
        sysClock_1S = Signal()  # 秒时钟信号

        # ##########定时器#############
        timer_1s = QTimer()  # 定义全局0.1s的周期定时器
        timer_1s.start(1000)

        # ###########__init__###############
        def __init__(self):
            super().__init__()
            self.widgets = []  # 所有的视窗列表


    # ########################本项目的实例化###################################
    ui = UI()

    # #######################画面实例化和初始化#################################
    # ########################实例化模板画面#################################
    mainWindow = MainWindow()
    mainWindow.setupUi(mainWindow)  # 模板画面的本体初始化
    init_widgets(mainWindow)  # 模板画面的部件初始化
    mainWindow.show()
    ui.widgets.append(mainWindow)  # 将画面加入视窗列表,方便管理

    # ###########################信号的连接####################################
    # ###########################项目级别信号的连接###############################
    ui.timer_1s.timeout.connect(ui.sysClock_1S.emit)
    ui.sysClock_1S.connect(lambda: mainWindow.labelSystemClock.setText(strftime('%Y-%m-%d %H:%M:%S')))
    # ###########################mainWindow画面信号的连接######################
    mainWindow.RadioButtons_1.stateNum.connect(lambda x: mainWindow.label_1.setText(str(x)))
    mainWindow.pushButton_1.clicked.connect(lambda: mainWindow.RadioButtons_1.stateNum.emit(1))
    mainWindow.doubleSpinBox_1.valueChanged.connect(lambda x: mainWindow.label_22.setText(str(x)))

    # ###########################槽函数####################################

    sys.exit(app.exec())

运行截图:

本阶段的资源链接:https://download.csdn.net/download/xulibo5828/89120987?spm=1001.2101.3001.9499

自定义功能的仪表盘

        一个具有设定值输入、微调,实时值显示,历史曲线实时显示的仪表盘。

        在CAD软件中大致规划一下功能区的尺寸和排列:

         功能和分工规划:编程阶段可视的部件在QT designer中完成部署和设置,运行阶段可视的动态部件在程序中根据QT designer中的设置值自动计算和部署。

        对外接口:设定值、实时值。

        前端设计(待续

 

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

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

相关文章

【MYSQL】MySQL整体结构之系统服务

一、系统服务层 学习了MySQL网络连接层后,接下来看看系统服务层,MySQL大多数核心功能都位于这一层,包括客户端SQL请求解析、语义分析、查询优化、缓存以及所有的内置函数(例如:日期、时间、统计、加密函数...&#xff…

【Godot4.2】CanvasItem绘图函数全解析 - 9.绘制表格

概述 之前介绍TextLine和TextParagraph的时候,提到了用制表符和设定列宽形式来绘制简易表格,但是很明显,单纯使用此种方式很难获得对表格的精确控制。 所以对于表格绘制问题,我决定单独开坑,单独深入研究。 目前比较…

Steam平台游戏发行流程

Steam平台游戏发行流程 大家好我是艾西,一个做服务器租用的网络架构师也是游戏热爱者,经常在steam平台玩各种游戏享受快乐生活。去年幻兽帕鲁以及雾锁王国在年底横空出世,幻兽帕鲁更是在短短一星期取得了非常好的成绩,那么作为游戏…

Redis从入门到精通(十七)多级缓存(二)Lua语言入门、OpenResty集群的安装与使用

文章目录 前言6.4 Lua语法入门6.4.1 初识Lua6.4.2 Hello World6.4.3 变量6.4.3.1 Lua的数据类型6.4.3.2 声明变量 6.4.4 循环6.4.5 函数6.4.6 条件控制 6.5 实现多级缓存6.5.1 安装和启动OpenResty6.5.2 实现ajax请求反向代理至OpenResty集群6.5.2.1 反向代理配置6.5.2.2 OpenR…

古月·ROS2入门21讲——学习笔记(二)常用工具部分15-21讲

上篇:古月ROS2入门21讲——学习笔记(一)核心概念部分1-14讲-CSDN博客 第十五讲:Launch:多节点启动与配置脚本 到目前为止,每当我们运行一个ROS节点,都需要打开一个新的终端运行一个命令。机器人…

使用ioctl扫描wifi信号获取信号属性的实例(二)

使用工具软件扫描 wifi 信号是一件很平常的事情,在知晓 wifi 密码的前提下,通常我们会尽可能地连接信号质量比较好的 wifi 信号,但是如何通过编程来扫描 wifi 信号并获得这些信号的属性(比如信号强度等),却鲜有文章提及&#xff0…

第16天:信息打点-CDN绕过业务部署漏洞回链接口探针全网扫描反向邮件

第十六天 本课意义 1.CDN服务对安全影响 2.CDN服务绕过识别手法 一、CDN服务-解释差异识别 1.前置知识: 传统访问:用户访问域名–>解析服务器IP–>访问目标主机普通CDN:用户访问域名–>CDN节点–>真实服务器IP–>访问目标…

C++项目 -- 负载均衡OJ(一)comm

C项目 – 负载均衡OJ(一)comm 文章目录 C项目 -- 负载均衡OJ(一)comm一、项目宏观结构1.项目功能2.项目结构 二、comm公共模块1.util.hpp2.log.hpp 一、项目宏观结构 1.项目功能 本项目的功能为一个在线的OJ,实现类似…

LLM生成模型在生物单细胞single cell的应用:scGPT

参考: https://github.com/bowang-lab/scGPT https://www.youtube.com/watch?vXhwYlgEeQAs 主要是把单细胞测序出来的基因表达量的拼接起来构建成的序列,这里不是用的基因的ATCG,是直接用的基因名称 训练数据:scGPT全人模型是在3…

ARMv8-A架构下的外部debug模型之外部调试事件(external debug events)概述

外部调试器与处理器之间的握手与external debug events 一,External Debug的使能二,外部调试器和CPU之间的握手三,外部调试事件 External debug events1. External debug request event2. Halt instruction debug event3. Halting step debug…

如何在宽松许可证下构建有竞争力的Milvus Cloud商业服务?

如何在宽松许可证下构建有竞争力的商业服务? 开源公司并不一定要修改许可证作为唯一的出路,不过其挑战在于找到开源与商业化之间的平衡。 以 Zilliz 为例,我们选择将开源向量数据库 Milvus 捐赠给 Linux 基金会。在过去四年的时间里,Milvus 已经在 GitHub 上获得了超过 …

一款廉价USB转485转换器原理

USB转485转换器实物 USB转485转换器外观 USB转485转换器内部 USB转485转换器电路板元件面TOP USB转485转换器电路板焊接面BOT 工作原理 SOP14芯片为USB-TTL转换器,虽然没有型号,应为南京沁恒的CH340C,无外部晶振。 SOP8为MAX485&#xff0c…

[Java、Android面试]_18_详解Handler机制 常见handler面试题(非常重要,非常高频!!)

本人今年参加了很多面试,也有幸拿到了一些大厂的offer,整理了众多面试资料,后续还会分享众多面试资料。 整理成了面试系列,由于时间有限,每天整理一点,后续会陆续分享出来,感兴趣的朋友可关注收…

数字乡村发展新模式:科技创新引领农业现代化与乡村振兴协同发展

随着信息技术的飞速发展,数字乡村已成为新时代农业现代化与乡村振兴协同发展的新模式。科技创新作为推动这一模式的核心动力,正引领着乡村产业结构的优化升级,促进农村经济的全面振兴,让农民在现代化的进程中共享发展成果。 一、科…

安装 k8s集群的问题:默认容器运行时从 Docker 改为 Containerd

安装 k8s集群的问题:默认容器运行时从 Docker 改为 Containerd 1、背景2、容器运行时从 Docker 改为 Containerd2.1、安装 Containerd:2.2、生成 Containerd 的配置文件2.3 、创建 /etc/crictl.yaml 文件2.4 、配置 Containerd 服务开机自启 &#x1f49…

Vue3用户交互——事件

Vue3用户交互——事件 1. 鼠标单击事件、输入框双向绑定和修饰符 html代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1…

动态规划|62.不同路径

力扣题目链接 class Solution { public:int uniquePaths(int m, int n) {vector<vector<int>> dp(m, vector<int>(n, 0));for (int i 0; i < m; i) dp[i][0] 1;for (int j 0; j < n; j) dp[0][j] 1;for (int i 1; i < m; i) {for (int j 1; …

Netty学习——高级篇2 Netty解码技术

接上篇&#xff1a;Netty学习——高级篇1 拆包 、粘包与编解码技术&#xff0c;本章继续介绍Netty的其他解码器 1 DelimiterBasedFrameDecoder分隔符解码器 DelimiterBasedFrameDecoder 分隔符解码器是按照指定分隔符进行解码的解码器&#xff0c;通过分隔符可以将二进制流拆分…

nginx+keepalived集群-双主

1. nginx部署 单机部署可参考&#xff1a;https://blog.csdn.net/ym5209999/article/details/119897237 主备模式可参考&#xff1a;https://blog.csdn.net/ym5209999/article/details/132983080 2. keepalived安装 [rootnginx1 ~]# yum -y install keepalived3. keepalived…

Unity DOTS1.0 入门(3) System与SystemGroup 概述

System与SystemGroup 概述 System System是提供一种代码逻辑,改变组件的数据状态,从一个状态到另外一个状态System在main thread里面运行, system.Update方法每一帧执行一次(其他线程中运行的就是JobSystem的事情了&#xff09;System是通过一个System Group这个体系来决定它…