【PyQt5】信号与槽用法入门

——学习《PyQt5快速开发与实战》的笔记

0.信号与槽机制的特点:

1.1 signal、slot都继承自 QtCore
1.2 signal与slot 可以 1对1,1对n,n对1,n对n
1.3 signal可以带参数,参数可以是python任意类型,str,num(int\float),bool,date,list,dict,tuple)
1.4 QObject.signal.connect(slot),连接
1.5 signal和slot可以是同步,也可以是异步(不懂)
1.6 可以跨线程
1.7 有可能会断开

核心使用语句:

控件:信号需要跟控件绑定
signal:有内置和自定义两种方式
操作方法:connect、disconnect、emit
slot:有内置和自定义两种方式

1.控件绑定信号

from PyQt5.QtCore import pyqtSignal
from PyQt5.QtWidgets import QMainWindow

class window(QMainWindow):
    # 直接在控件里面写一个信号变量,是类的全局变量
    btnClicked = pyqtSignal() #无参数信号

2、操作信号的方法

QObject.signal.connect(slot[, type=PyQt5.QtCore.QtAutoConnection[,no_reviver_check=False]])
  # slot - 要连接的那个槽函数,或者是另外一个信号
  # type - 连接的类型,这个一时半会还用不到,
  # no_revicer_check - 不让底层的C++接收器实例保持存在并且传递信号,默认状态是False,那就是要保持存在并且传递信号
QObject.signal.disconnect(slot)
  # slot - 要断开连接的槽函数
QObject.signal.emit(*args)
  # *args 可变参数,什么类型可以接受

3、入门案例

三种方式:
3.1 内置信号与槽
3.2 自定义信号与槽
3.3 装饰器信号与槽(1的衍生,先不管)

3.1 内置信号与槽

# 3.1 内置信号和槽的使用
from PyQt5.QtWidgets import QPushButton, QApplication,QWidget
from PyQt5.QtWidgets import QMessageBox
import sys

app =QApplication([])
widget = QWidget()

def showmsg():
    QMessageBox.information(widget,'信号提示框','OK,弹出测试信息')


if __name__ == '__main__':

    btn = QPushButton('测试点击按钮',widget)
    btn.clicked.connect(showmsg) # clicked 内置信号方法 showmsg 槽函数名称,作为索引
    widget.show()
    sys.exit(app.exec_())

  3.2 自定义信号与槽的使用

# 3.2 自定义信号与槽的使用
from PyQt5.QtCore import QObject, pyqtSignal

# 自定义的信号对象
class Q_type_signal( QObject):
    #定义信号
    sendmsg = pyqtSignal(object)

    def __init__(self):
        super(Q_type_signal, self).__init__()

    def run(self,send_msg):
        #发射信号

        self.sendmsg.emit(send_msg) #send_msg 就是下面槽函数 get() 接受的 msg变量

class Q_type_slot( QObject):
    def __init__(self):
        super(Q_type_slot, self).__init__()

    def get(self,msg):
        print('QSlot get msg:'+ msg)

if __name__ == '__main__':
    send = Q_type_signal()
    slot = Q_type_slot()

    send.sendmsg.connect(slot.get)
    send.run('hahaha')

  动作分解:

 执行结果:

 上面执行的是带有一个参数的信号传递,两个信号也是一样,只需要添加变量即可:

    def run(self,send_msg,send_int):
        #发射信号
        self.sendmsg.emit(send_msg, send_int) 


    def get(self,msg,int):
        print('QSlot get msg:'+ msg + int)

猜你喜欢

转载自www.cnblogs.com/watalo/p/12287421.html