从信号中断开插槽

时间:2014-01-27 15:34:14

标签: qt pyqt pyside signals-slots

PySide和PyQt采用Qt信号槽机制,只要与遍历的数据类型相匹配,就可以将任意/多个信号连接到任意/多个插槽。

信令对象具有接收时隙的一些知识,例如,通过方法receivers知道他们的号码,或者信号可以通过其disconnect方法与接收时隙断开连接。

我的问题与对位方向有关 - 例如插槽是否知道它连接了哪些信号?插槽可以与信号断开吗?

更新:为什么我要问这个 - 我有一个对象执行一些计算。计算由用户可编辑的Python表达式定义。解析表达式并从中识别出必要的数据源...计算对象(充当插槽)然后连接到这些数据源(它们充当信号),一旦数据源生成/更新值,这个事实就是发信号通知到插槽并重新评估表达式。当用户改变表达式时,需要再次解析它并与现有信号(即数据源)断开连接并连接到新数据源。您可以想象它类似于Excel中连接到其他单元格的公式。

我知道有几种方法可以解决这个问题,例如:手动跟踪连接(好吧,这是额外的工作)或删除表达式对象并在每次更改时创建一个新对象(似乎不够好,因为用户可能想要追溯计算数据源,这将无济于事) 。但我很好奇这是否可以纯粹使用简单的信号槽机制来解决。换句话说,我对任何变通方法都不感兴趣......我知道它们并将使用它们我信号插槽在这里没有帮助。 :)

1 个答案:

答案 0 :(得分:2)

您建议的方法强制在具体数据小部件和计算引擎之间建立非常密切的关系。您将UI与计算混合在一起。这使得它比它需要的更难。

您可以尝试的是模型视图方法。该模型将是QAbstractTableModel的简单实现。视图将是使用QDataWidgetMapper映射到模型单元格的单个数据输入窗口小部件。计算引擎只访问模型,完全不知道小部件如何修改模型。这使生活更轻松。

计算对象只能使用一个dataChanged信号连接到模型,并且会通知任何变量的更改。通过在表中包含两列,您可以轻松地传递值和变量名称。

模型的实现可以非常简单,您可以在第一列中包含变量名称的字符串列表,以及第二列的变体列表。每当调用dataChanged时,模型必须正确发出setData信号。