• Pyside6:信号与槽


    在Qt中,控件与控件之间的联系全靠信号(Signals)与槽(Slots)来进行对接。例如一个清空按钮发送了点击的信号,输入框通过连接该按钮的点击信号,当收到点击信号时,进行清空输入框文本的操作,如此完成清空输入框内容的逻辑。

    一、信号和槽的关系

    用一张图来说明信号与槽的关系:

    比方说有一个看不见东西可怜的小明,他需要买肉做红烧肉,当他来到集市上,听到有猪肉荣的叫卖声时,就去买肉回家做红烧肉了。

    • 小明即是接收信号的槽,当他收到卖肉的信号,他就会买肉然后做红烧肉
    • 卖肉的猪肉荣,他的叫卖声就是在发信号

    如果小明想要买肉做红烧肉,同时他又想修仙,那么当他听到卖肉的叫卖声和卖仙丹的叫卖声,他就会到两个摊位上都买,然后可能用肉做红烧肉,仙丹直接吃;也有可能把肉和仙丹一起做成仙丹炒肉的名菜再吃。

    所以一个槽函数可以接收多种信号,一个信号也可以发送给多个槽(相当于小明哥哥、小明妹妹、小明弟弟、包租婆、包租公、火云邪神等等都来买肉)。 

    二、Qt Designer中添加自定义槽

    比如说你有个自定义的槽函数test在主控件中,则只需要右键该主控件(根控件),选择改变 信号/槽即可:

    第一步

    第二步 

    第三步 

    在代码中添加槽函数,并在槽函数中实现相应逻辑:

    1. class MyWindow(QMainWindow):
    2. ...
    3. def test(self):
    4. # 实现逻辑
    5. pass

    自定义信号也是如此操作。 关于槽函数中的参数,可以根据信号的传参类型填写。

    三、代码中添加自定义信号

    首先,添加自定义信号的基类需要为QObject,否则将会报错:

    3.1 代码展示 

    1. # -*- coding: utf-8 -*-
    2. from PySide6 import QtCore
    3. class CustomWidget(QtCore.QObject):
    4. sig_test_1 = QtCore.Signal()
    5. sig_test_2 = QtCore.Signal(float)
    6. sig_test_3 = QtCore.Signal(tuple)
    7. sig_test_4 = QtCore.Signal(int, int)
    8. def test_1(self):
    9. self.sig_test_1.emit()
    10. def test_2(self):
    11. self.sig_test_2.emit(0.5)
    12. def test_3(self):
    13. self.sig_test_3.emit(('test', 20, [2, 3, 4, 5]))
    14. def test_4(self):
    15. self.sig_test_4.emit(20, 30)
    • 自定义信号Signal发送时参数不定,如果需要发送多个参数,个人比较推荐直接用tuple,这样就可以直接在槽函数中通过语法糖获取参数,例:name, age, score_list = data
    • 自定义信号的发送信号时机需要开发者自己确认,相当灵活

    3.2 自定义信号什么时候使用 

    一般来说,在开发Qt项目时,很多控件可能无法我们的满足,因此需要继承控件去扩展功能,此时经常会使用到自定义信号来完成功能。

    四、代码中信号与槽的连接 

    1. def test(index):
    2. pass
    3. class MyWindow(QMainWindow):
    4. def __init__(self):
    5. super().__init__()
    6. # currentIndexChanged为ComboBox的一个自带信号,会发送一个下标
    7. self.unit_combo_box.currentIndexChanged.connect(self.unit_change)
    8. self.unit_combo_box.currentIndexChanged.connect(test)
    9. def unit_change(self, index):
    10. pass

    可以看到一个信号连接槽函数通过connect方法,可以是对象方法,也可以是一个单独的函数。

    对应的,还有一个disconnect方法来解除连接,不过用到的情况不多。

    五、 如何查看控件内置信号与槽

    点进控件的源码中,查看该部分内容:

    如果类似pyqtgraph的库,信号也可以在类名下方找到:

    六、总结 

    为了连接各个控件,完成需求开发,信号与槽的应用不可避免,如何运用好内置信号与槽,如何定义好自定义信号和槽都是需要慢慢开发,积累经验的。

  • 相关阅读:
    【修改mysql密码的两种方式】
    白鳝:聊聊IvorySQL的Oracle兼容技术细节与实现原理
    云数据库保护需要注意哪些事项?
    实验探究-ExecutorServiceAPI----未完待续!!!!
    LeetCode-813. 最大平均值和的分组【动态规划,前缀和】
    Lua中如何实现类似gdb的断点调试—07支持通过函数名称添加断点
    java在Windows配置Path环境变量
    已解决ModuleNotFoundError: No module named ‘PIL‘
    微擎模块 维修店3.4.2 公众号+小程序双端共用版源码
    chromadb
  • 原文地址:https://blog.csdn.net/monsterk1/article/details/133136378