如果你接触到这部分,说明对控件和布局管理有了一定的了解。
首先我们要知道QT核心机制就是信号与槽,也是对象间进行通信的重要机制,不像python/java通过函数调用就可以。
信号与槽的三种使用方法:
信号分为自定义与内置,槽也分为槽函数(控件本身的)和自定义槽函数,信号与槽使用中可以任意组合。
- 内置信号与槽:这是指使用窗口控件内置的控件调用槽函数,槽函数可以自定义也可以使用内置的函数,下面是使用自定义的showMsg槽函数进行演示,内置需要我们熟悉控价的相关文档。
from PyQt5.QtWidgets import QPushButton , QApplication, QWidget from PyQt5.QtWidgets import QMessageBox import sys app = QApplication(sys.argv) widget = QWidget() #自定义一个槽函数 def showMsg(): QMessageBox.information(widget, "信息提示框", "ok,弹出测试信息") #内置信号QPushButton控件 btn = QPushButton( "测试点击按钮", widget) #信号与槽通过object.singnal.connect()方法进行连 btn.clicked.connect(showMsg) widget.show() sys.exit(app.exec_())
- 自定义信号与槽:我们可以使用PyQt5.QtCore.pyqtSingal为QObject创建一个自定义信号,如sendmsg = pyqtSignal(object)定义一个信号,需要注意只能在QObject的子类中定义。其执行流程就是:定义信号-->定义槽函数-->连接信号与曹函数-->发射信号。
from PyQt5.QtCore import QObject, pyqtSignal # 信号对象 class QTypeSignal(QObject): # 定义一个信号 sendmsg = pyqtSignal(object) def __init__(self): super(QTypeSignal, self).__init__() def run(self): # 发射信号 self.sendmsg.emit('Hello Pyqt5') # 槽对象 class QTypeSlot(QObject): def __init__(self): super(QTypeSlot, self).__init__() def get(self, msg): print("QSlot get msg => " + msg) if __name__ == '__main__': send = QTypeSignal() slot = QTypeSlot() #将send对象的sendmsg信号发射给slot对象的get函数 send.sendmsg.connect(slot.get) send.run()
- 装饰器的信号与槽:
-
装饰器的方法定义信号和槽
@PyQt5.QtCore.pyqtSlot(parameter)
def on_发送者对像名称_发射信号名称(self, parameter):
pass
生效的前提是已经执行QtCore.QMetaObject.connectSlotsByName(self)
-
QtCore.QMetaObject.connectSlotsByName作用是根据信号名称自动连接槽函数,就是将QObject的子孙对象按照objectName连接到相应的槽函数
from PyQt5 import QtCore
from PyQt5.QtWidgets import QApplication ,QWidget ,QHBoxLayout , QPushButton
import sys
class CustWidget( QWidget ):
def __init__(self, parent=None):
super(CustWidget, self).__init__(parent)
self.okButton = QPushButton("OK", self)
#使用setObjectName设置okButton为对象名称
self.okButton.setObjectName("okButton")
layout = QHBoxLayout()
layout.addWidget(self.okButton)
self.setLayout(layout)
QtCore.QMetaObject.connectSlotsByName(self)
#去掉on是因为会受connectSlotsByName的影响
#self.okButton.clicked.connncet(okButton_clicked)
@QtCore.pyqtSlot()#运行self.okButton.clicked.connncet(okButton_clicked)修饰器要去掉。
def on_okButton_clicked(self):
print( "点击了OK按钮")
if __name__ == "__main__":
app = QApplication(sys.argv)
win = CustWidget()
win.show()
sys.exit(app.exec_())
读PyQt5快速开发与实战--学习笔记