基于对象的 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
QT之QSignalMapper(可以理解为转发器,多个按钮绑定到一个Edit上,且能分辨。每个单独连接的话,反而麻烦)