ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

pyqt5信号与槽的使用

2022-08-07 00:30:40  阅读:232  来源: 互联网

标签:__ closeWinBtn Form self pyqt5 ui 信号 使用


信号与槽介绍

信号(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"

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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有