pyqt 自定义信号,
PyQ5已经自动定义了很多夸脱自建的信号。但是在实际的使用中为了灵活使用信号与槽机制,可以根据需要自定义信号。本文就将为大家详细讲讲PyQt5自定义信号,感兴趣的可以了解一下
PyQ5已经自动定义了很多夸脱自建的信号。但是在实际的使用中为了灵活使用信号与槽机制,可以根据需要自定义信号。通过使用pyqtSignal()方法定义新的信号,新的信号作为类的属性。
自定义信号说明:
新的信号应该定义在某个东西的子类中。新的信号必须作为定义类的一部分,不允许将信号作为类的属性在类定义之后通过动态的方式进行添加。通过这种方式新的信号才能自动的添加到元对象类中。这就意味这新定义的信号将会出现在夸脱设计师,并且可以通过QMetaObject API实现内省。
自定义信号的发射,通过发出()方法类实现
自定义信号的一般流程如下:
定义信号定义槽函数绑定信号和槽发射信号代码示例
导入系统
来自PyQt5 .QtCore导入pyqtSignal,QObject,Qt,pyqtSlot
来自PyQt5 .QtWidgets导入QWidget,QApplication,QGroupBox,QPushButton,QLabel,QCheckBox,QSpinBox,QHBoxLayout,QComboBox,QGridLayout
类信号发出(QWidget):
helpSignal=pyqtSignal(str)
printSignal=pyqtSignal(list)
#声明一个多重载版本的信号,包括了一个带(同国际组织)国际组织和潜艇用热中子反应堆(海底热反应堆的缩写)类型参数的信号,以及带潜艇用热中子反应堆(海底热反应堆的缩写)参数的信号
previewSignal=pyqtSignal([int,str],[str])
def __init__(self):
超级()。__init__()
self.initUI()
定义(自己):
self.creatContorls(打印控制:)
self.creatResult(操作结果:)
layout=QHBoxLayout()
布局。添加小部件(自我。控制组)
布局。添加小部件(自我。结果组)
self.setLayout(布局)
自我。求救信号。连接(自我。showhelpmessage)
自我。打印信号。连接(自我。打印纸)
self.previewSignal[str].连接(自我预览纸)
self.previewSignal[int,str].连接(带royal geographical society 皇家地理学会的自我。预习试卷)
自我。打印按钮。点击了。连接(自我。发射打印信号)
自我。预览按钮。点击了。连接(自我。发射预览信号)
自我设定几何图形(300,300,290,150)
self.setWindowTitle(定义的信号)
self.show()
def creatContorls(自我,标题):
自我。控件组=q组框(标题)
self.printButton=QPushButton(打印)
self.previewButton=QPushButton(预览)
numberLabel=QLabel(打印份数:)
pageLabel=QLabel(纸张类型:)
self.previewStatus=QCheckBox(全屏预览)
self.numberSpinBox=QSpinBox()
self.numberSpinBox.setRange(1,100)
self.styleCombo=QComboBox(self)
self.styleCombo.addItem("A4")
self.styleCombo.addItem("A5")
controlsLayout = QGridLayout()
controlsLayout.addWidget(numberLabel, 0, 0)
controlsLayout.addWidget(self.numberSpinBox, 0, 1)
controlsLayout.addWidget(pageLabel, 0, 2)
controlsLayout.addWidget(self.styleCombo, 0, 3)
controlsLayout.addWidget(self.printButton, 0, 4)
controlsLayout.addWidget(self.previewStatus, 3, 0)
controlsLayout.addWidget(self.previewButton, 3, 1)
self.controlsGroup.setLayout(controlsLayout)
def creatResult(self,title):
self.resultGroup = QGroupBox(title)
self.resultLabel = QLabel("")
layout = QHBoxLayout()
layout.addWidget(self.resultLabel)
self.resultGroup.setLayout(layout)
def emitPreviewSignal(self):
if self.previewStatus.isChecked() == True:
self.previewSignal[int,str].emit(1080," Full Screen")
elif self.previewStatus.isChecked() == False:
self.previewSignal[str].emit("Preview")
def emitPrintSignal(self):
pList = []
pList.append(self.numberSpinBox.value ())
pList.append(self.styleCombo.currentText())
self.printSignal.emit(pList)
def printPaper(self,list):
self.resultLabel.setText("Print: "+"份数:"+ str(list[0]) +" 纸张:"+str(list[1]))
def previewPaperWithArgs(self,style,text):
self.resultLabel.setText(str(style)+text)
def previewPaper(self,text):
self.resultLabel.setText(text)
def keyPressEvent(self, event):
if event.key() == Qt.Key_F1:
self.helpSignal.emit("help message")
def showHelpMessage(self,message):
self.resultLabel.setText(message)
#self.statusBar().showMessage(message)
if __name__ == __main__:
app = QApplication(sys.argv)
dispatch = SignalEmit()
sys.exit(app.exec_())
样例说明:
通过一个模拟打印的界面来详细说明一下关于信号的自定义,在打印的时候可以设定打印的分数,纸张类型,触发打印按钮之后,将执行结果显示到右侧;通过全屏预览QCheckBox来选择是否通过全屏模式进行预览,将执行结果显示到右侧。
通过点击F1快捷键,可以显示helpMessage信息。
界面分析:
该界面主要由两个部分组成:一个是打印控制,另一个是操作结果。
通过QHBoxLayout组合起来,如下所示:
layout = QHBoxLayout()
然后通过creatContorls定义打印控制界面,
def creatContorls(self,title):
QSpinBox是一个计数器控件,允许用户选择一个整数值通过单击向上向下或者按键盘上的上下键来增加减少当前显示的值,当然用户也可以输入值。
QComboBox是一个集按钮和下拉选项于一体的控件,也称做下拉列表框。
然后通过creatResult定义操作结果界面:
def creatResult(self,title):
代码分析:
helpSignal = pyqtSignal(str)
通过pyqtSignal()定义了三个信号,helpSignal,printSignal,previewSignal。其中:
helpSignal 为str参数类型的信号。
printSignal 为list参数类型的信号。
previewSignal为一个多重载版本的信号,包括了一个带int和str类型参数的信号,以及str类行的参数。
self.helpSignal.connect(self.showHelpMessage)
绑定信号和槽。
着重说明一下多重载版本的信号的绑定,previewSignal有两个版本previewSignal(str),previewSignal(int,str)。由于存在两个版本,从因此在绑定的时候需要显式的指定信号和槽的绑定关系。
具体如下:
self.previewSignal[str].connect(self.previewPaper) self.previewSignal[int,str].connect(self.previewPaperWithArgs)
其中[str]参数的previewSignal信号绑定previewPaper();[int,str]的previewSignal信号绑定previewPaperWithArgs()
def emitPreviewSignal(self):
多重载版本的信号的发射也需要制定对应发射的版本,类似同信号的版定。
def emitPrintSignal(self):
如代码中所示,在信号发射的时候可以传递python数据类型的参数,在本例中传递list类型的参数pList。
def keyPressEvent(self, event):
通过复写keyPressEvent()方法,将F1快捷键进行功能的拓展。在windows的大部分应用,我们都会使用一些快捷键来快速的完成某些特定的功能。比如F1键,会快速调出帮助界面,那就可以复写keyPressEvent()方法来模拟发送所需的信号,来完成对应任务。
注意事项:
1.自定义的信号在init()函数之前定义
2.自定义型号可以传递,str、int、list、object、float、tuple、dict等很多类型的参数
3.注意signal和slot的调用逻辑,避免signal和slot之间出现死循环。如在slot方法中继续发射该信号
到此这篇关于Python PyQt5学习之自定义信号的文章就介绍到这了,更多相关Python PyQt5信号内容请搜索盛行IT软件开发工作室以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT软件开发工作室!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。