【问题标题】:QMetaObject::invokeMethod doesn't find the methodQMetaObject::invokeMethod 找不到方法
【发布时间】:2014-04-17 08:08:32
【问题描述】:

我想使用 QMetaObject::invokeMethod 来调用对象的方法(稍后它将在另一个线程中运行,然后 invokeMethod 就派上用场了)。我在 Python 3.3 上使用 PySide 1.2.1 的 Qt 4.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' 装饰让它工作。感谢评论和答案。

【问题讨论】:

  • beep() 应该声明为一个插槽,不是吗?
  • 哦,是的,这就是解决方案。需要在def beep(self):前面加上@QtCore.Slot()。我不习惯它,因为现在连接信号我只给他任何可调用的,它工作正常。不是很明显必须在这里做,但感谢您的评论。

标签: python qt pyside qtcore qt-signals


【解决方案1】:

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

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

试试这个装饰器:

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

详情请参阅following documentation 以及this one

使用 QtCore.Slot()

使用装饰器 QtCore.Slot() 分配和重载插槽。同样,要定义签名,只需传递 QtCore.Signal() 类之类的类型。与 Signal() 类不同,要重载函数,您不会将每个变体都作为元组或列表传递。相反,您必须为每个不同的签名定义一个新的装饰器。下面的示例部分会更清楚。

另一个区别是它的关键字。 Slot() 接受名称和结果。 result 关键字定义将返回的类型,可以是 C 或 Python 类型。 name 的行为与 Signal() 中的行为相同。如果没有作为名称传递,则新插槽将与正在修饰的函数具有相同的名称。

【讨论】:

  • 感谢您的解释。尽管使用了 Slot 装饰器,但我稍微扩展了问题(通过参数)并遇到了同样的问题。您知道上面的第二个代码 sn-p 有什么问题吗?装修合适吗?
  • QMetaObject::invokeMethod: No such method Tester::beep(text) 但你在声明中有 self 。我不知道答案,但我会尝试通过 Tester,t 对作为快速测试的通用参数。如果做不到这一点,您可以将该方法移出类。
  • 你也可以调用一个在内部执行invokemethod的类方法。
  • 将 Tester t 作为通用参数 QGenericArgument('self', t) 传递给 No such method Tester::beep(self,text) 尽管在某种意义上这正是我所拥有的方法。将方法移出类似乎很困难,因为QMetaObject::invokeMethod 似乎需要一个 obj 作为第一个参数。接下来会尝试内部的invokeMethod。
  • @Trilarion:其他解决方法是使用 setter 方法设置字符串,并在您的插槽中使用它。我知道这很hacky,但这也可以让你继续前进。 ;-)
猜你喜欢
  • 1970-01-01
  • 2021-07-11
  • 2010-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多