PyQt4 @pyqtSlot:result关键字参数的作用是什么?

8
通过阅读这篇文章,我有两个问题:
1.它说:

有时需要明确标记Python方法为Qt slot

虽然我总是使用@pyqtSlot装饰器,因为它说:

连接信号到装饰的Python方法还具有减少内存使用量和稍微更快的优点

我问自己:在哪些特定情况下是必要的?是否有不使用@pyqtSlot装饰器的优点?
2.结果关键字参数,它的目的是什么?
@pyqtSlot(int, result=int)
def foo(self, arg1):
    """ C++: int foo(int) """

似乎是返回值类型,但据我所知,在发射信号时无法检索返回值。对此有什么想法吗?
1个回答

7
  1. PyQt架构的原因使得它更快。PyQt将Python slots转换为C++ slots,以便与Qt框架通信。当您显式地将Python方法标记为Qt slot并为其提供C++签名时,PyQt代码不必猜测C++签名,因为它已经被指定了。这可以在重型项目上增强性能。

  2. 仅当您想将slot作为普通函数调用时才需要返回值。

编辑:看起来QMetaObject.invokeMethod方法执行一个slot并使用它的返回值。


这很有道理,谢谢!所以我想没有不使用装饰器的优势,也就是说<始终使用它>? - Pedru
如果这是一个基本的插槽,没有太多的使用并且不被频繁调用,那么就不需要使用装饰器。它可以增强脚本的功能,但在简单函数上不会有太大的影响。 - iTayb
好的,我会说,始终使用它,因为它增强了代码的可读性(带有语法高亮)。 - Pedru
4
关于 result= 关键字参数的说明:如果您的槽函数返回一个值,则在 PyQt D-Bus 绑定中,该参数是“必需”的。因此,对于您想通过 D-Bus 公开的函数,它接受一个字符串并返回一个整数,您应该使用 pyqtSlot(str, result=int) 来修饰该函数。如果没有包含 result=int,则通过 D-Bus 的调用将不会返回任何值。我之所以提到这一点,是因为最近我花了很长时间来调试这个问题(请参见 http://stackoverflow.com/questions/11731709/how-does-one-expose-methods-and-properties-on-dbus-using-a-qdbusabstractadaptor)。 - evadeflow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接