我有一个父类(super class)Common,它继承自QObject。然后,我得到了一个Item类,该类继承自Common

Common.h

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);
    //^^^^^^^^^
};

关于c++ - QMetaObject::invokeMethod:使用继承时没有此类方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24642370/

10-10 23:19