QMetaObject :: invokeMethod中没有找到方法(QMetaObject::in

2019-10-19 21:48发布

我想用QMetaObject :: invokeMethod中来调用对象的方法(稍后会在另一个线程中运行,然后invokeMethod中派上用场)。 我用PySide 1.2.1的Qt的4.8绑定Python的3.3。 完整的例子是:

from PySide import QtCore

class Tester(QtCore.QObject):
    def __init__(self):
        super().__init__()

    def beep(self):
        print('beep')

if __name__ == '__main__':
    t = Tester()
    QtCore.QMetaObject.invokeMethod(t, 'beep', QtCore.Qt.AutoConnection)

而输出是:

QMetaObject::invokeMethod: No such method Tester::beep()

而我预计beep 。 该方法不被调用。

那么,什么是错的? 它似乎很简单,我无法找到的错误。


编辑:我用它来工作`@ QtCore.Slot”的方法装饰。 多亏了意见和答案。

Answer 1:

你不能调用普通方法中,只有信号和槽。 这就是为什么它不为你工作。 查看QMetaObject文档关于它的详细信息:

上调用的对象物obj的构件(一个信号或一个槽名称)。 如果该成员可调用返回true。 如果没有这样的成员或参数不匹配,则返回false。

试试这个装饰:

...
@QtCore.Slot()
def beep(self):
    print('beep')
...

请参阅以下文档的详细信息,以及这一个 :

使用QtCore.Slot()

时隙分配和重载用装饰QtCore.Slot()。 再次,以限定一个签名只是传递类型像QtCore.Signal()类。 不同于信号()类,重载函数,你没有通过每一个变化的元组或列表。 相反,你必须定义一个新的装饰为每个不同的签名。 下面的例子节将使其更清晰。

另一个区别是关于它的关键字。 插槽()接受的名称和结果。 结果关键字定义将被返回,并且可以是C或Python类型的类型。 名称的行为同样的方式在信号()。 如果没有作为名称,然后通过新的插槽将具有相同的名称作为被装饰的功能。



文章来源: QMetaObject::invokeMethod doesn't find the method