pyqt5信号与槽的使用
作者:互联网
信号与槽介绍
信号(Signal)和槽(Slot)是Qt中的核心机制,也是在PyQt编程中对象之间进行通信的机制。在Qt中,每一个QObject对象和PyQt中所有继承自QWidget的控件(这些都是QObject的子对象)都支持信号与槽机制。当信号发射时,连接的槽函数将会自动执行。在PyQt 5中信号与槽通过object.signal.connect()方法连接。
PyQt的窗口控件类中有很多内置信号,开发者也可以添加自定义信号。信号与槽具有如下特点。
- 一个信号可以连接多个槽。
- 一个信号可以连接另一个信号。
- 信号参数可以是任何Python类型。
- 一个槽可以监听多个信号。
- 信号与槽的连接方式可以是同步连接,也可以是异步连接。
- 信号与槽的连接可能会跨线程。
- 信号可能会断开。
在GUI编程中,当改变一个控件的状态时(如单击了按钮),通常需要通知另一个控件,也就是实现了对象之间的通信。在早期的GUI编程中使用的是回调机制,在Qt中则使用一种新机制——信号与槽。在编写一个类时,要先定义该类的信号与槽,在类中信号与槽进行连接,实现对象之间的数据传输。
当事件或者状态发生改变时,就会发出信号。同时,信号会触发所有与这个事件(信号)相关的函数(槽)。信号与槽可以是多对多的关系。一个信号可以连接多个槽,一个槽也可以监听多个信号。
简单使用
Qt Designer提供了基本的编辑信号槽方法。首先,新建一个模板名为"Widget"的简单窗口,该窗口文件名为MainWinSignalSlog01.ui。
在Qt Designer窗口左侧有一个Buttons栏,找到QPushButton控件,把它拖到窗体Form中。在属性编辑器中,找到按钮对应的text属性,把属性值改为"关闭窗口",并将objectName属性值改为"closeWinBtn"
单击工具栏上的"编辑信号/槽"(或者通过单击"Edit"(编辑)菜单→"编辑信号/槽"),进入信号槽编辑模式,可以直接在发射者("关闭窗口"按钮)上按住鼠标左键不放,拖动到接收者(Form窗体)上,这样就建立起了连接。
将界面文件转换为Python文件,直接运行tools.py。
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'd:\Github\PyProjects\pyqt5\ui\MainWinSignalSlog01.ui'
#
# Created by: PyQt5 UI code generator 5.15.7
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(400, 300)
self.closeWinBtn = QtWidgets.QPushButton(Form)
self.closeWinBtn.setGeometry(QtCore.QRect(150, 110, 75, 23))
self.closeWinBtn.setObjectName("closeWinBtn")
self.retranslateUi(Form)
self.closeWinBtn.clicked.connect(Form.close) # type: ignore
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
_translate = QtCore.QCoreApplication.translate
Form.setWindowTitle(_translate("Form", "Form"))
self.closeWinBtn.setText(_translate("Form", "关闭窗口"))
为了使窗口的显示和业务逻辑分离,再新建一个调用窗口显示的文件CallMainWinSignalSlog01.py,其完整代码如下:
import sys
from PyQt5.QtWidgets import QApplication ,QMainWindow
from ui.MainWinSignalSlog01 import Ui_Form # 我这里把所有的ui文件放在ui文件夹下
class MyMainWindow(QMainWindow,Ui_Form):
def __init__(self,parent=None):
super(MyMainWindow,self).__init__(parent)
self.setupUi(self)
if __name__=="__main__":
app=QApplication(sys.argv)
myWin=MyMainWindow()
myWin.show()
sys.exit(app.exec_())
运行效果:
点击就会关闭窗口。
定义信号
使用PyQt5.QtCore.pyqtSignal()
函数可以为QObject
创建一个信号,使用pyqtSingnal()
函数可以把信号定义为类的属性。
- 为
QObject
对象创建信号
使用pyqtSignal()
函数创建一个或多个重载的未绑定的信号作为类的属性,信号只能在QObject
的子类中定义。
class Foo(QObject):
valueChanged = pyqtSingal([dict], [list])
信号必须在类创建时定义,不能在类创建后作为类的属性动态添加进来。types参数表示定义信号时参数的类型,name参数表示信号名字,该项缺省时使用类的属性名字。
- 为控件创建信号
from PyQt5.QtCore import pyqtSignal
from PyQt5.QtWidgets import QApplication ,QMainWindow
class MyMainWindow(QMainWindow):
btnClickSingal=pyqtSignal() # 创建一个btnClickSingal信号
- 操作信号
使用connect()
函数可以把信号绑定到槽函数上。
使用disconnect()
函数可以解除信号与槽函数的绑定。
使用emit()
函数可以发射信号。
标签:__,closeWinBtn,Form,self,pyqt5,ui,信号,使用 来源: https://www.cnblogs.com/holychan/p/16558240.html