pyqt5-003

信号处理:

  API:

    widget信号.connect(信号槽)

    obj.disconnect():

      取消链接信号与槽

      obj:

        控件

        信号

    widget.blockSignal(bool):

      临时(取消)组织制定控件所有的信号与槽的连接

    widget.signalsBlocked():

      信号是否被阻止

    widget.receivers(信号):

      返回连接到信号的接收器数量

  应用场景:

    监听信号,响应用户行为

    信号与槽机制

信号:

  objectNameChange(objectName) 对象名称发生改变时发生时发射此信号

  destroyed(obj) 对象被销毁时,发射此信号

 

 

信号与槽机制:

  信号(Signal)和槽(Slot)是Qt中的核心机制,主要作用在于对象之间进行通信

 

信号:

  当一个控件的转台发生改变时,向外界发出的信息

 

槽:

  一个执行某些操作的函数/方法

**所有继承自QWidget的控件都支持'信号与槽'的机制

 

 

 按钮控件内置的一些方法:

  pressed()长按时执行的方法

  clicked()单击是执行的方法

  也可以自定义信号

槽:

  不同控件内置的槽函数

  自定义的函数/方法

连接方式:

  object信号.connect(槽函数)

特性:

  一个信号可以连接多个槽函数

  一个信号也可以链接临沂个信号

  信号的参数可以是任何Python类型

  一个槽可以监听多个信号

 

 

# 信号与槽
from PyQt5.Qt import *
import sys

class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.resize(500, 500)
        self.setWindowTitle('QObject的学习')
        self.setup_ui()

    def setup_ui(self):
        self.Signal_test()


    def Signal_test(self):
        # 对象信号操作
        self.obj = QObject()

        # def destroy_cao(obj):
        #     print('对象被释放了',obj)
        # self.obj.destroyed.connect(destroy_cao)
        # 对象销毁时触发的事件
        # del self.obj



        def obj_name_cao(name):
            print('对象名称发生了改变1', name)

        def obj_name_cao2(name):
            print('对象名称发生了改变2', name)

        self.obj.objectNameChanged.connect(obj_name_cao)
        # 对象改变时触发的事件
        self.obj.objectNameChanged.connect(obj_name_cao2)

        # print(self.obj.receivers('对象信号不是字符串'))
        # 错误的打印
        print('连接的信号数:', self.obj.receivers(self.obj.objectNameChanged))

        self.obj.setObjectName('xxx')
        # self.obj.objectNameChanged.disconnect()
        # 断开连接,信号槽断开连接,未接受到信号

        # print(self.obj.signalsBlocked(), 1)
        # 信号是否被阻止

        # self.obj.blockSignals(True)
        # 临时断开连接,信号槽断开连接,未接受到信号
        # self.obj.setObjectName('ooo')

        # print(self.obj.signalsBlocked(), 2)
        # 信号是否被阻止

        # self.obj.blockSignals(False)
        # 恢复连接

        # print(self.obj.signalsBlocked(), 3)
        # 信号是否被阻止

        # self.obj.objectNameChanged(obj_name_cao)
        # 再次连接

        # self.obj.setObjectName('xxoo')


        pass

if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec_())

 

 实例演示:

  

# 信号与槽操作
from PyQt5.Qt import *
import sys

app = QApplication(sys.argv)
window = QWidget()
window.resize(500,500)



# ****************具体操作开始*****************
# 单击按钮打印消息
# btn = QPushButton(window)
# btn.setText('click')
# def cao():
#     print('You clicked me')
# btn.clicked.connect(cao)


# 更改windowTitle
def cao(title):
    print('WindowTitleChanged',title)
    
    # window.windowTitleChanged.disconnect()
    # 断开连接
    # window.setWindowTitle('005-'+ title)
    # window.windowTitleChanged.connect(cao)
    # 恢复连接

    window.blockSignals(True)
    # 暂时断开连接
    window.setWindowTitle('005-' + title)
    window.blockSignals(False)
    # 恢复连接
window.windowTitleChanged.connect(cao)
window.setWindowTitle('005')
window.setWindowTitle('004')
window.setWindowTitle('003')
# ****************具体操作结束*****************

window.show()
sys.exit(app.exec_())

 

 

  

posted @ 2020-05-08 21:49  King~~~  阅读(203)  评论(0编辑  收藏  举报