QMetaObject::invokeMethod:使用继承时没有这样的方法

QMetaObject::invokeMethod: No such method when using inheritance

本文关键字:方法 invokeMethod 继承 QMetaObject      更新时间:2023-10-16

我有一个继承自QObject的超类Common。然后我有一个类Item,继承自Common

构成

class Common : public QObject {
    Q_OBJECT
public:
    // some methods
};

Item.h

class Item : public Common {
    Q_OBJECT
public:
    // some methods
    void test(QString value);
};

Item.cpp

void Item::test(QString value) {
    qDebug() << value;
}

我想使用QMetaObject::invokeMethod动态调用函数。因此,我在Item类中实现了一个测试函数,它只接受一个字符串。

Item* item = new Item();
QMetaObject::invokeMethod(item, "test", Qt::DirectConnection, Q_ARG(QString, "1234"));

这不起作用。我得到以下错误:QMetaObject::invokeMethod: No such method Common::test(QString),这是完全可以的,因为Common类没有test函数。

我怎么能告诉QMetaObject::invokeMethod,它应该从Item类调用方法?

QMetaObject::invokeMethod只能调用Qt元对象系统已知的方法。这些是槽和"可调用"函数,后者是在它们之前带有关键字Q_INVOKABLE的函数。

所以要么写:

class Item : public Common {
    Q_OBJECT
public slots:
    // ^^^^^
    void test(QString value);
};

或:

class Item : public Common {
    Q_OBJECT
public:
    Q_INVOKABLE void test(QString value);
    //^^^^^^^^^
};