我想使用QMetaObject::invokeMethod来调用一个对象的方法(稍后它将在另一个线程中运行,然后invokeMethod就会派上用场)。我在Python3.3上使用了PySide 1.2.1的QT4.8绑定。完整的例子是:
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的装饰来工作。感谢你的评论和答案。
发布于 2014-04-17 08:30:18
不能调用常规方法,只能调用信号和插槽。这就是为什么它不适合你。有关它的详细信息,请参阅QMetaObject文档:
调用对象obj上的成员(信号或槽名)。如果可以调用成员,则返回true。如果没有这样的成员或参数不匹配,则返回false。
试试这个装潢师:
...
@QtCore.Slot()
def beep(self):
print('beep')
...有关详细信息和这一个,请参见这一个
使用QtCore.Slot() 使用装饰器QtCore.Slot()分配和重载插槽。同样,要定义签名,只需传递像QtCore.Signal()类这样的类型。与信号()类不同的是,要重载一个函数,不需要以元组或列表的形式传递每个变体。相反,您必须为每个不同的签名定义一个新的装饰器。下面的示例部分将使其更加清晰。 另一个不同之处在于它的关键词。槽()接受一个名称和一个结果。结果关键字定义了将返回的类型,可以是C或Python类型。name的行为方式与信号()中的行为相同。如果没有任何东西作为名称传递,那么新的槽将具有与正在被修饰的函数相同的名称。
https://stackoverflow.com/questions/23127844
复制相似问题