PyQt4 @pyqtSlot:kwarg的结果是什么?

Ped*_*dru 7 python pyqt signals-slots pyqt4

通过阅读本文,出现了两个问题:

它说

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

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

将信号连接到装饰的Python方法还具有减少内存使用量的优势,并且速度稍快

我问自己:哪些具体案例是必要的?并且:不使用@pyqtSlot装饰器有什么好处吗?

2.结果关键字参数,它的目的是什么?

@pyqtSlot(int, result=int)
def foo(self, arg1):
    """ C++: int foo(int) """
Run Code Online (Sandbox Code Playgroud)

它看起来像返回值的类型,但AFAIK在发出信号时无法检索返回值.

关于那个的任何想法?

iTa*_*ayb 6

  1. 由于PyQt架构,它更快.PyQt将python插槽转换为C++插槽,以便与Qt框架通信.当您明确地将Python方法标记为Qt槽并为其提供C++签名时,PyQt代码不必猜测C++签名本身,因为它已经指定.这可以提高重型项目的性能.

  2. 仅当您要将插槽作为普通功能调用时,才需要返回值.

编辑:似乎该QMetaObject.invokeMethod方法执行一个插槽并使用它的返回值.

  • 关于`result =`kwd arg的注释:如果你的槽返回一个值,那么PyQt D-Bus绑定是_required_.因此,对于要通过D-Bus公开的函数,它接受一个字符串并返回一个int,你可以使用`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.) (4认同)