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())