【发布时间】: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信号的插槽中访问它。
标签: python qt pyqt signals-slots qsignalmapper