PySide(PyQt)的特殊按钮(互锁、自锁、独占模式)

 Qt Designer中创建窗口,放置一个QGroupBox,命名为btnStation,这就是自定义的按钮站,按钮站里放置6个按钮。自锁按钮相当于电器中的自锁功能的按钮,每按一次状态反转并保持不变(相当于qt自带的checkable)。独占按钮也是自锁功能的按钮,不同的是当独占按钮为ON时,其余所有按钮均被置为OFF并且禁用。另外3个互锁按钮为一个互锁组,每一时刻互锁组中只能有一个为ON。

运行效果:

调用脚本:

# encoding: utf-8
# 示例按钮站的Python脚本。
from functools import partial

from PySide6.QtCore import QObject, Signal
from PySide6.QtWidgets import QApplication, QMainWindow
import sys
import demo1_rc  # 导入主画面


# 定义主窗口
class MainWindow(QMainWindow, demo1_rc.Ui_MainWindow):
    def __init__(self):
        super().__init__()


# ################公用的功能函数#############################
class Jobs:
    @staticmethod
    # 系统的初始化
    def start_todo():

        # ###############主窗口的部件初始化##################
        window_main.move(0, 0)
        # 主窗口的按钮站
        ui.btnStation = window_main.btnStation.children()   # 按钮站的所有成员,将其定义为全局变量
        ui.interlock_group = [window_main.btn_interlock_a,   # 互锁组成员
                              window_main.btn_interlock_b,
                              window_main.btn_interlock_c]
        for b in ui.btnStation:
            b.setProperty('drawTool', 'none')  # 按钮的初始状态
        # 主窗口的部件的功能提示定义
        window_main.btn_only1.setToolTip('独占模式的按钮,按下后禁用其余所有')
        window_main.btn_lockSelf.setToolTip('独占模式的按钮,按下后反转并自锁')
        window_main.btn_interlock_a.setToolTip('互锁模式,只能有一个ON')
        window_main.btn_interlock_b.setToolTip('互锁模式,只能有一个ON')
        window_main.btn_interlock_c.setToolTip('互锁模式,只能有一个ON')
        window_main.btn_normal.setToolTip('普通按钮')


    @staticmethod
    # 系统退出前的工作
    def before_quit():
        pass


# ###########################信号的连接和槽函数####################################

def signal_slot():
    # ###########################主窗口的信号和槽####################################

    # “独占模式”按钮点击的槽函数
    def window1_btn_only1_clicked(group):   # group是本按钮所在的按钮站
        self = window_main.btn_only1
        if not self.property('activated'):   # 如果本按钮未激活
            for b in group:
                b.setEnabled(False)          # 禁用按钮站所有按钮
                b.setProperty('activated', False)   # turn off按钮站所有按钮
                b.setStyleSheet(b.styleSheet())  # 刷新所有按钮的显示
            self.setEnabled(True)  # 启用本按钮
        else:
            for b in group:          # 启用按钮站所有按钮
                b.setEnabled(True)

        self.setProperty('activated', not (self.property('activated')))   # 反转本按钮的激活状态
        self.setStyleSheet(self.styleSheet())  # 刷新本按钮的显示

    window_main.btn_only1.clicked.connect(lambda: window1_btn_only1_clicked(ui.btnStation))   # 将信号连接到槽上

    # 定义互锁组成员
    ui.interlock_group = [window_main.btn_interlock_a,
                          window_main.btn_interlock_b,
                          window_main.btn_interlock_c]

    # 回调互锁槽函数
    def call_slot(btn):
        # 闭包槽函数
        def slot():
            self = btn
            for b in ui.interlock_group:
                b.setProperty('activated', False)  # turn off按钮站所有按钮
                b.setStyleSheet(b.styleSheet())  # 刷新所有按钮的显示
            self.setProperty('activated', True)
            self.setStyleSheet(self.styleSheet())
        return slot

    # 连接互锁组的按钮到槽函数
    for b in ui.interlock_group:
        b.clicked.connect(call_slot(b))

    # 自锁按钮点击的槽函数
    def window_main_btn_lockSelf_clicked():
        self = window_main.btn_lockSelf
        self.setProperty('activated', not self.property('activated'))
        self.setStyleSheet(self.styleSheet())

    window_main.btn_lockSelf.clicked.connect(window_main_btn_lockSelf_clicked)


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

    # #######################项目级别的定义###################################
    class UI(QObject):  # 将项目定义为QObject,用来管理项目级别的信号和变量
        showing_function = Signal(str)        # 显示按钮功能的信号

        # ###########__init__###############
        def __init__(self):
            super().__init__()


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

    # ########################实例化画面#################################
    window_main = MainWindow()  # 主画面实例化

    window_main.show()  # 显示画面
    window_main.setupUi(window_main)  # 画面初始化

    Jobs.start_todo()  # 系统初始化
    signal_slot()      # 信号与槽的定义

    app.aboutToQuit.connect(Jobs.before_quit)  # 退出系统之前的操作,例如保存设置和释放资源

    sys.exit(app.exec())

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

深蓝海拓

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值