界面图:
Qt Designer中创建窗口,放置一个QGroupBox,命名为btnStation,这就是自定义的按钮站,按钮站里放置6个按钮。自锁按钮相当于电器中的自锁功能的按钮,每按一次状态反转并保持不变。独占按钮也是自锁功能的按钮,不同的是当独占按钮为ON时,其余所有按钮均被置为OFF并且禁用。另外3个互锁按钮为一个互锁组,每一时刻互锁组中只能有一个为ON。
运行效果:
调用脚本:
# encoding: utf-8
# 示例按钮站的Python脚本。
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():
self = window_main.btn_only1
if not self.property('activated'): # 如果本按钮未激活
for b in ui.btnStation:
b.setEnabled(False) # 禁用按钮站所有按钮
b.setProperty('activated', False) # turn off按钮站所有按钮
b.setStyleSheet(b.styleSheet()) # 刷新本按钮的显示
else:
for b in ui.btnStation: # 启用按钮站所有按钮
b.setEnabled(True)
self.setEnabled(True) # 启用本按钮
self.setProperty('activated', not (self.property('activated'))) # 反转本按钮的激活状态
self.setStyleSheet(self.styleSheet()) # 刷新本按钮的显示
if self.property('activated'):
ui.showing_function.emit('独占模式') # 系统的信号showing_function发射
else:
ui.showing_function.emit('非独占模式')
window_main.btn_only1.clicked.connect(window1_btn_only1_clicked) # 将信号连接到槽上
# “自锁模式”按钮点击的槽函数
def window1_btn_lockSelf_clicked():
self = window_main.btn_lockSelf
self.setProperty('activated', not (self.property('activated'))) # 反转本按钮的激活状态
self.setStyleSheet(self.styleSheet()) # 刷新本按钮的显示
if self.property('activated'):
ui.showing_function.emit('自锁模式')
else:
ui.showing_function.emit('非自锁模式')
window_main.btn_lockSelf.clicked.connect(window1_btn_lockSelf_clicked) # 将信号连接到槽上
# “互锁模式”按钮点击的槽函数
def window1_btn_interlock_a_clicked():
self = window_main.btn_interlock_a
for b in ui.interlock_group:
b.setProperty('activated', False)
b.setStyleSheet(b.styleSheet()) # 刷新按钮的显示
self.setProperty('activated', True)
self.setStyleSheet(self.styleSheet()) # 刷新按钮的显示
ui.showing_function.emit('互锁a')
def window1_btn_interlock_b_clicked():
self = window_main.btn_interlock_b
for b in ui.interlock_group:
b.setProperty('activated', False)
b.setStyleSheet(b.styleSheet()) # 刷新按钮的显示
self.setProperty('activated', True)
self.setStyleSheet(self.styleSheet()) # 刷新按钮的显示
ui.showing_function.emit('互锁b')
def window1_btn_interlock_c_clicked():
self = window_main.btn_interlock_c
for b in ui.interlock_group:
b.setProperty('activated', False)
b.setStyleSheet(b.styleSheet()) # 刷新按钮的显示
self.setProperty('activated', True)
self.setStyleSheet(self.styleSheet()) # 刷新按钮的显示
ui.showing_function.emit('互锁c')
window_main.btn_interlock_a.clicked.connect(window1_btn_interlock_a_clicked)
window_main.btn_interlock_b.clicked.connect(window1_btn_interlock_b_clicked)
window_main.btn_interlock_c.clicked.connect(window1_btn_interlock_c_clicked)
# 系统槽函数showing_function
ui.showing_function.connect(window_main.label_function.setText)
# #############################主程序###################################
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())
ui文件的资源下载:https://download.csdn.net/download/xulibo5828/89456307?spm=1001.2101.3001.9500