2014-01-27 43 views
2

PySide和PyQt采用Qt信号插槽机制,通过这种机制,我们可以将任何/多个信号连接到任何/多个插槽,只要散布的数据类型匹配。从信号中断开插槽

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

我的问题与反方向有关 - 例如,插槽是否知道它连接了哪些信号?插槽能否与信号断开?

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

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

+0

我不这么认为。但是,您可以手动跟踪连接和断开连接(例如,使用'QObject :: connect'的包装器)。 –

+0

我认为必须有一些东西,因为当一个接收对象被删除时,必须通知它的一个接收器已经死了以停止发送信号给它。但是我还没有在文档中找到任何内容....当然,手动保持轨道是我的另一种选择。但是,如果Qt能够自动为我执行此操作,我希望避免双重工作。 –

+0

我认为你问的是错误的问题。请解释你想要解决什么问题,不要问如何解决你对某个神秘问题的解决方案。寻求帮助时这是很常见的错误。为什么你需要知道插槽连接的位置?也许在这种情况下,您需要暂时断开连接信号来防止递归?为了防止可能的递归,有'blockSignals'方法。 –

回答

2

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

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

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

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

+0

我认为这是一个总的矫枉过正。 :)我提到了更简单的解决方法。顺便说一句。我没有说任何关于用户界面,小部件等的信号/插槽机制绑定到QObject,而不仅仅是QWidget。我的小工具在另一个层面,我甚至没有在我的问题中触及。 –

+0

@ VL.K。您已经问过如何将数据源干净地映射到计算引擎。我已经向你展示了它是如何完成的。它工作的很好,我广泛使用这种方法,并且很容易处理。它可能比任何其他解决方案的代码少,维护也容易得多。软件元素之间的松散耦合被认为是一个良好的工程实践 –

+0

@ VL.K。这些小部件是可选的,不管修改数据是什么。交易是你不需要让计算引擎处理大量的依赖于变量的连接。这是糟糕的设计。使用数据模型时,dataChanged只有一个信号插槽连接,并且您的引擎只需要持有指向模型的指针。计算引擎更容易。对模型内容进行故障诊断也很容易:只需将其附加到“QTableView”。 –