其他分享
首页 > 其他分享> > pyqt5信号与槽的使用

pyqt5信号与槽的使用

作者:互联网

信号与槽介绍

信号(Signal)和槽(Slot)是Qt中的核心机制,也是在PyQt编程中对象之间进行通信的机制。在Qt中,每一个QObject对象和PyQt中所有继承自QWidget的控件(这些都是QObject的子对象)都支持信号与槽机制。当信号发射时,连接的槽函数将会自动执行。在PyQt 5中信号与槽通过object.signal.connect()方法连接。
PyQt的窗口控件类中有很多内置信号,开发者也可以添加自定义信号。信号与槽具有如下特点。

在GUI编程中,当改变一个控件的状态时(如单击了按钮),通常需要通知另一个控件,也就是实现了对象之间的通信。在早期的GUI编程中使用的是回调机制,在Qt中则使用一种新机制——信号与槽。在编写一个类时,要先定义该类的信号与槽,在类中信号与槽进行连接,实现对象之间的数据传输。

当事件或者状态发生改变时,就会发出信号。同时,信号会触发所有与这个事件(信号)相关的函数(槽)。信号与槽可以是多对多的关系。一个信号可以连接多个槽,一个槽也可以监听多个信号。

简单使用

Qt Designer提供了基本的编辑信号槽方法。首先,新建一个模板名为"Widget"的简单窗口,该窗口文件名为MainWinSignalSlog01.ui。

在Qt Designer窗口左侧有一个Buttons栏,找到QPushButton控件,把它拖到窗体Form中。在属性编辑器中,找到按钮对应的text属性,把属性值改为"关闭窗口",并将objectName属性值改为"closeWinBtn"

img

单击工具栏上的"编辑信号/槽"(或者通过单击"Edit"(编辑)菜单→"编辑信号/槽"),进入信号槽编辑模式,可以直接在发射者("关闭窗口"按钮)上按住鼠标左键不放,拖动到接收者(Form窗体)上,这样就建立起了连接。

img

img

将界面文件转换为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_())

运行效果:

img

点击就会关闭窗口。

定义信号

使用PyQt5.QtCore.pyqtSignal()函数可以为QObject创建一个信号,使用pyqtSingnal()函数可以把信号定义为类的属性。

img

  1. QObject对象创建信号
    使用pyqtSignal()函数创建一个或多个重载的未绑定的信号作为类的属性,信号只能在QObject的子类中定义。
class Foo(QObject):
    valueChanged = pyqtSingal([dict], [list])

信号必须在类创建时定义,不能在类创建后作为类的属性动态添加进来。types参数表示定义信号时参数的类型,name参数表示信号名字,该项缺省时使用类的属性名字。

  1. 为控件创建信号
from PyQt5.QtCore import pyqtSignal
from PyQt5.QtWidgets import QApplication ,QMainWindow


class MyMainWindow(QMainWindow):
    btnClickSingal=pyqtSignal() # 创建一个btnClickSingal信号
  1. 操作信号

使用connect()函数可以把信号绑定到槽函数上。

img

使用disconnect()函数可以解除信号与槽函数的绑定。

img

使用emit()函数可以发射信号。

img

标签:__,closeWinBtn,Form,self,pyqt5,ui,信号,使用
来源: https://www.cnblogs.com/holychan/p/16558240.html