首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QMetaObject::invokeMethod找不到方法

QMetaObject::invokeMethod找不到方法
EN

Stack Overflow用户
提问于 2014-04-17 08:08:32
回答 1查看 3.3K关注 0票数 2

我想使用QMetaObject::invokeMethod来调用一个对象的方法(稍后它将在另一个线程中运行,然后invokeMethod就会派上用场)。我在Python3.3上使用了PySide 1.2.1的QT4.8绑定。完整的例子是:

代码语言:javascript
复制
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)

产出如下:

代码语言:javascript
复制
QMetaObject::invokeMethod: No such method Tester::beep()

而我期待的是beep。没有调用该方法。

那怎么了?这似乎太简单了,我找不到错误。

编辑:--我让它在方法上使用`@QtCore.Slot的装饰来工作。感谢你的评论和答案。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-17 08:30:18

不能调用常规方法,只能调用信号和插槽。这就是为什么它不适合你。有关它的详细信息,请参阅QMetaObject文档

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

试试这个装潢师:

代码语言:javascript
复制
...
@QtCore.Slot()
def beep(self):
    print('beep')
...

有关详细信息和这一个,请参见这一个

使用QtCore.Slot() 使用装饰器QtCore.Slot()分配和重载插槽。同样,要定义签名,只需传递像QtCore.Signal()类这样的类型。与信号()类不同的是,要重载一个函数,不需要以元组或列表的形式传递每个变体。相反,您必须为每个不同的签名定义一个新的装饰器。下面的示例部分将使其更加清晰。 另一个不同之处在于它的关键词。槽()接受一个名称和一个结果。结果关键字定义了将返回的类型,可以是C或Python类型。name的行为方式与信号()中的行为相同。如果没有任何东西作为名称传递,那么新的槽将具有与正在被修饰的函数相同的名称。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23127844

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档