基于对象的 QSignalMapper 的问题

Posted

技术标签:

【中文标题】基于对象的 QSignalMapper 的问题【英文标题】:Trouble with object-based QSignalMapper 【发布时间】:2017-11-14 15:11:38 【问题描述】:

我正在尝试在 PyQt 中设置信号槽排列,其中信号传输大量信息。我想通过将我要传输的各种信息设置为QObject 的属性来使用QObject 作为载体。从理论上讲,这应该可行 - 有一个 QSignalMapper.setMapping() 重载,它将发送者和 QObject 作为参数。

以下是精简后的代码:

self.mapper = QtCore.QSignalMapper()
self.timeline.finished.connect(self.mapper.map)
carrier = QtCore.QObject()
carrier.contents = (item1, item2)
self.mapper.setMapping(self.timeline, carrier)
self.portalMapper.mapped.connect(self.report)

def report(self, carrierObject):
    print 'Triggered'

不幸的是,它不起作用。我已经通过消除过程将问题追溯到setMapping 函数。

如果我将QObject 换成int,同样的方案也可以正常工作。它也与我添加到 QObject 的属性没有任何关系 - 使用全新的 QObject 会导致同样的问题。

setMapping 函数的这个特定重载似乎发生了一些事情。关于这里的问题有什么想法吗?

【问题讨论】:

使用QSignalMapper 没有任何价值。只需定义一个自定义信号并直接发送数据。 我不确定该怎么做,@ekhumoro ...我的代码正在等待的信号是 Qt 标准 QTimeline.finished,而且必须是,因为我正在等待计时器在继续下一步之前结束。我可以将finished() 信号连接到一个函数,该函数又发送一个自定义信号......但这不只是概括 QSignalMapper 的目的,接收一个信号并发送一个带有新参数的新信号吗? 当然 - 但它更简单。但是,您的代码真的需要发送信号吗?在您的示例中,信号只有一个消费者(self),因此发出信号似乎是完全多余的。您所做的只是发送一个指向对象的指针,而不是数据本身(即没有任何内容被复制)。您不妨保留对数据本身的引用作为self 的属性,然后直接在连接到finished 信号的插槽中访问它。 【参考方案1】:

感谢@ekhumoro 建议完全跳过 QSignalMapper 方法,只创建一个自定义信号。像魅力一样工作。

【讨论】:

以上是关于基于对象的 QSignalMapper 的问题的主要内容,如果未能解决你的问题,请参考以下文章

QSignalMapper 和 QAction 的问题永远不会触发 Slot

QtApplets-QSignalMapper使用

QT之QSignalMapper(可以理解为转发器,多个按钮绑定到一个Edit上,且能分辨。每个单独连接的话,反而麻烦)

Qt:如何使用 QSignalMapper 为非标准按钮实现 QDialogBu​​ttonBox ?

QSignalMapper类处理多信号关联同一个槽的方法

Qt 插槽未被调用