Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python PySide:从插槽返回值_Python_Pyside_Signals Slots - Fatal编程技术网

Python PySide:从插槽返回值

Python PySide:从插槽返回值,python,pyside,signals-slots,Python,Pyside,Signals Slots,Pyside声明插槽可以有返回值,但我还没有弄清楚如何让它这样做 我在这方面找不到任何可用的代码示例,因此我按照文档的建议添加了一个decorator: def testSlot(self): print('testSlot called') return 'RETURN VALUE RETURN VALUE RETURN VALUE' 我试图像这样捕捉返回值: ret = foo.testSignal.emit() 但它不起作用。我的测试代码,你可以找到,也有错误输出。谢谢

Pyside声明插槽可以有返回值,但我还没有弄清楚如何让它这样做

我在这方面找不到任何可用的代码示例,因此我按照文档的建议添加了一个decorator:

def testSlot(self):
    print('testSlot called')
    return 'RETURN VALUE RETURN VALUE RETURN VALUE'
我试图像这样捕捉返回值:

ret = foo.testSignal.emit()
但它不起作用。我的测试代码,你可以找到,也有错误输出。谢谢你的帮助

编辑:我删除了decorator,它解决了崩溃问题,但它仍然没有返回我希望它返回的值

按原样运行脚本给我以下信息:

foo.testSignal.emit()
已调用测试槽
真的


恐怕你所想的是不可能的。 信号和插槽松散耦合在一起,因此发出信号不会直接调用插槽,因此无法检索“其”返回值

如果你考虑一下,这可能会更清楚:

您可以连接两个不同的插槽(例如,两个不同的类别),这些插槽对一个信号返回不同的值。两个返回值中的哪一个应该到达您尝试分配的变量


您可能的意思是:这是完全不同的,允许通过“名称”在元对象系统上“调用”方法来返回值无论您想从testSlot函数返回到类的一个属性中,在该属性中信号是emmited的

您在decoratorWhoops中有两个
@
s,但不知道它们是如何进入的。我修好了,但还是坏了,怎么坏的?什么是完整的追踪?它给了我一个答案。问题详情全文如下。控制台上没有输出。而且,似乎是pastie添加了额外的
@
,出于某种原因,每次重新添加后它都会再次添加。我也遇到了类似的问题。一些有时对我有用的尝试:
@Slot()
,没有参数。如果失败,请完全删除装饰程序。很抱歉延迟回复,我不在美国,互联网访问受到限制。你能详细说明一下通过“名称”在元对象系统上“调用”方法吗?如何用它来捕获返回值?您可以通过Meta对象系统中的名称(如QStand)调用C++中的“调用”或“调用”方法,使用--所以这是动态的,而不是预编译的。调用C++方法所需要的,例如QML—QML只能调用元对象系统已知的方法。因此,需要Q_INVOCABLE来让函数为人所知-如果你想要一个从PySide到QML的返回值,你没有Q_INVOCABLE-你只需要声明一个插槽,然后元对象系统自动知道它。这是正确的答案。有一点值得商榷的是,默认情况下,发送信号是直接(同步)的,而不是排队(异步)的,因此您可以将其视为“直接调用”,因为执行在信号处理程序中继续,但正如所述,可能在多个信号处理程序中,按照连接顺序进行。还有,为什么这样的错误代码会崩溃?有什么工具可以警告您连接到错误返回值的处理程序?嗯,不是真的。每个默认信号插槽连接是
ÀutonConnection
s:在同一个线程中,它们是直接调用(更快),但在不同的线程中,它们是
QueuedConnection
s-称为异步。因此,除非您将DirectConnection传递到不同的线程信号插槽对,否则您是安全的。见和。