【问题标题】:Disconnecting slots from signals将插槽与信号断开
【发布时间】: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


【解决方案1】:

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

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

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

模型的实现可以非常简单,第一列可以有一个变量名的字符串列表,第二列可以有一个变体列表。当然,无论何时调用 setData,模型都必须正确发出 dataChanged 信号。

【讨论】:

  • 我认为这完全是矫枉过正。 :) 有更简单的解决方法,我提到过。顺便提一句。我没有说任何关于 UI、小部件等的信息。信号/插槽是绑定到 QObject 的机制,而不仅仅是绑定到 QWidget。我的小部件在另一层,我什至没有在我的问题中触及。
  • @VL.K.您已经问过如何将数据源清晰地映射到计算引擎。我已经向你展示了它是如何完成的。效果很好,我广泛使用这种方法,而且很容易处理。它可能比任何其他解决方案的代码更少,并且更容易维护。软件元素之间的松散耦合被认为是一种良好的工程实践
  • @VL.K.小部件是可选的,修改数据的内容无关紧要。交易是您不需要让计算引擎处理大量与变量相关的连接。那是糟糕的设计。对于数据模型,dataChanged 只有一个信号槽连接,您的引擎只需要保存一个指向模型的指针。在计算引擎上要容易得多。对模型内容进行故障排除也很容易:只需将其附加到 QTableView
  • @VL.K.如果您的接收器对象需要处理它自己的信号/插槽连接并且它需要知道它附加到哪些对象,那么您可能做错了。我认为你是。
  • @VL.K.引擎还可以通过搜索变量名称列轻松查找模型索引。所以它只需要知道符号变量名称,它可以在设置时执行一次查找并将QModelIndex存储在其符号表中。通过这种方式,您可能会缩小代码。您在此处需要的表模型的最小实现还不到一屏代码。
猜你喜欢
  • 2019-02-12
  • 1970-01-01
  • 1970-01-01
  • 2015-04-15
  • 1970-01-01
  • 1970-01-01
  • 2013-01-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多