Python PySide/PyQt信号,可传输任何值(包括无值)

Python PySide/PyQt信号,可传输任何值(包括无值),python,qt,pyqt,pyside,nonetype,Python,Qt,Pyqt,Pyside,Nonetype,我在PySide中使用Qt信号/插槽机制时遇到问题,但我不想发送任何信号 假设我有一个名为Calculator的类(QObject的子类),它可以执行某些计算,其结果可以是任何东西,即任何类型的Python对象,甚至没有。我需要Calculator类的实例能够向一些使用者对象(QObject的子类)发送结果信号 我所拥有的: class Calculator(QObject): finished = PySide.QtCore.Signal(object) # object means

我在PySide中使用Qt信号/插槽机制时遇到问题,但我不想发送任何信号

假设我有一个名为Calculator的类(QObject的子类),它可以执行某些计算,其结果可以是任何东西,即任何类型的Python对象,甚至没有。我需要Calculator类的实例能够向一些使用者对象(QObject的子类)发送结果信号

我所拥有的:

class Calculator(QObject):
    finished = PySide.QtCore.Signal(object)  # object means it can transmit anything

    def calc(self):
        ... # calculation of the result
        self.finished.emit(result)

class Consumer(QObject):
    def __init__(self, calculator):
        ...
        calculator.finished.connect(self.consume)

    def consume(self, result):  # do something with the result
        ...
除结果为“无”的情况外,此操作正常。然后程序在发出信号时崩溃。似乎没有一个不是Python对象(这可能是真的,我对语言标准不太精通)

现在我有了一个解决方法,使用两个信号:

    finished = PySide.QtCore.Signal((),(object,))
以及:

此解决方案可行,但很复杂,因为它需要使用者对象将信号链接两次。两个插槽或一个插槽的一个默认参数等于零

class Consumer(QObject):
    def __init__(self, calculator):
        ...
        calculator.finished.connect(self.consume)
        calculator.finished[object].connect(self.consume)

    def consume(self, result=None):  # do something with the result
        ...
这很复杂,在创建许多不同的使用者类别时容易出错。 我认为这个问题与PyQt相同,不同之处在于替代信号是使用列表
[],[object]
定义的,而不是元组
(),(object,)


我的问题是:这个问题有没有简单的解决办法?理想情况下只有一个信号?

发布问题后,我找到了答案。所以我很抱歉回答我自己的问题-我知道这不是StackOverflow上应该是什么样子。我创建了一个名为
ResultHolder
的类,它封装了实际结果(result是这个类的一个成员变量)。然后我正在传输这个
ResultHolder
类的实例。解决方案的其余部分就简单明了了。

作为旁白,这个bug仍然存在于PySide中,它在1.2.1版(自1.1.0以来就存在)的None信号传输中出现故障。在以下位置有错误报告:


显然,V.K.将None封装在单独的类中的解决方案仍然有效,选择另一种类型进行传输也是如此(我将我的
None
切换为
float('nan')
)。我只是想更新这个,因为我遇到了同样的问题,发现了这个问题,后来还有解释segfault的bug报告。

如果PySide无法发出
None
(这肯定是一个真正的python对象),那将是一个bug。但是,我使用PySide-1.2.1进行了测试,无法重现您的问题。我在PyQt中也从未见过这样的问题。因此,要么您在代码的其他地方出错,要么您正在使用的PySide版本中存在错误。@ekhumoro好的,我必须确认,当我现在测试PySide和PyQt的其他版本时,错误已经消失。我将再次检查我的代码的其余部分,可能会删除这个问题。显然,问题在别处。为了纠正我的主张,我对你的回答投了赞成票。回答你自己的问题没有错。事实上恰恰相反,因为它避免了人们浪费时间回答不再相关的问题。话虽如此,请看我对你的问题的评论。@Ekhumaro:问题通常是在有更好的答案时出现的,老年退休金计划不承认这一点,他们会坚持自己的答案。@LaszloPapp。我不知道你说的是什么,但如果我能从OP自己的回答中看出他确实解决了他的问题,我就不会浪费时间回答问题。另一方面,如果他的答案在某种程度上是错误的或不充分的,那么我可以提供一个更好的答案,或者用一些评论指出不足之处。明确鼓励用户回答他们自己的问题。@ekhurmo:e.g.或@LaszloPapp。好吧,当然,“你可以把马引向水边”,等等。但是如果OP没有发布“错误”的答案,你怎么知道要纠正它呢?
class Consumer(QObject):
    def __init__(self, calculator):
        ...
        calculator.finished.connect(self.consume)
        calculator.finished[object].connect(self.consume)

    def consume(self, result=None):  # do something with the result
        ...