我有一个超级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
类调用该方法?
答案 0 :(得分:24)
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);
//^^^^^^^^^
};