我有一個超類Common
,它繼承自QObject
。然後我有一個類Item
,它繼承了Common
。QMetaObject :: invokeMethod:使用繼承時沒有這樣的方法
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
類的方法?
是否'類Item'有'Q_OBJECT'宏?爲了使元對象系統知道槽,這是必需的。添加插槽仍然是可能的,但它們只會是正常的功能。此外,該功能首先需要是一個插槽(或「Q_INVOKABLE」方法)。 – leemes
不,它沒有。我添加了它,但仍然出現錯誤。我應該編輯我的問題並將必要的源代碼放入其中,或者您有其他提示嗎? – Niklas
當您添加宏時,重新運行qmake。它需要掃描宏的文件,以便知道它需要在其上運行'moc'。 Qt的另一個缺陷......;) – leemes