【发布时间】:2014-02-18 12:43:18
【问题描述】:
PySide 和 PyQt 采用 Qt 信号槽机制,只要传输的数据类型匹配,我们就可以将任何/多个信号连接到任何/多个槽。
信令对象对接收时隙有一些了解,例如通过receivers 方法知道它们的号码,或者信号可以通过disconnect 方法从接收槽断开。
我的问题与相反的方向有关 - 例如插槽是否知道它连接到哪些信号?插槽可以断开信号吗?
更新:那么我为什么要问这个 - 我有一个执行一些计算的对象。计算由用户可编辑的 Python 表达式定义。解析表达式并从中识别必要的数据源......计算对象(充当插槽)然后连接到这些数据源(它们充当信号),一旦数据源产生/更新一个值,这个事实是向槽发出信号,然后重新评估表达式。并且当用户更改表达式时,需要再次对其进行解析并断开与现有信号(即数据源)的连接并连接到新的数据源。您可以想象它类似于 Excel 中的公式,它连接到其他单元格。
我知道有几种方法可以解决这个问题,例如手动跟踪连接(嗯,这是额外的工作)或删除表达式对象并在每次更改时创建一个新对象(似乎不够好,因为用户可能希望追溯计算数据源,这无济于事) .但我很好奇这是否可以纯粹使用简单的信号槽机制来解决。换句话说,我对任何解决方法都不感兴趣......我知道它们并将使用它们我信号槽在这里无济于事。 :)
【问题讨论】:
-
我不这么认为。但是,您可以手动跟踪连接和断开连接(例如,使用
QObject::connect的包装器)。 -
我认为一定有什么,因为当一个接收对象被删除时,必须通知信号它的一个接收者已经死了才能停止向它发送信号。但是我在文档中没有找到任何东西......当然,手动保持跟踪是我的另一种选择。但是,如果 Qt 可以自动为我做这件事,我想避免重复工作。
-
我认为你问错了问题。请说明您要解决什么问题,不要问如何解决您对某些神秘问题的解决方案。这是寻求帮助时很常见的错误。为什么你需要知道插槽连接在哪里?也许在这种情况下,您需要临时断开信号来防止递归?为了防止可能的递归,有
blockSignals方法。 -
我已更新问题以解释我的意图。
-
您可以保存
QObject::connect返回的QMetaObject::Connection对象,并在QObject::disconnect中使用。这不是额外的工作。
标签: qt pyqt pyside signals-slots