Ich habe eine Superklasse bekam Common
, die von QObject
erbt. Dann habe ich bekam eine Klasse Item
, die von Common
erbt.QMetaObject :: InvokeMethod: Eine solche Methode, wenn Vererbung
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;
}
Ich möchteverwendenum eine Funktion dynamisch aufzurufen. So implementiert ich eine Testfunktion in der Item
-Klasse, die genau eine Zeichenfolge nimmt.
Item* item = new Item();
QMetaObject::invokeMethod(item, "test", Qt::DirectConnection, Q_ARG(QString, "1234"));
arbeiten Dies gilt nicht. Ich erhalte den folgenden Fehler: QMetaObject::invokeMethod: No such method Common::test(QString)
, die vollkommen in Ordnung und in Ordnung ist, weil die Common
Klasse keine test
Funktion hat.
Wie kann ich QMetaObject::invokeMethod
sagen, dass es die Methode aus der Item
Klasse aufrufen sollte?
Hat 'Klasse Item' haben' Q_OBJECT' Makro? Dies ist erforderlich, um Slots dem Meta-Objekt-System bekannt zu machen. Das Hinzufügen von Slots ist immer noch möglich, aber sie werden dann nur normale Funktionen sein. Außerdem muss die Funktion an erster Stelle ein Slot (oder eine "Q_INVOKABLE" -Methode) sein. – leemes
Nein, hat es nicht. Ich habe es hinzugefügt, aber immer noch den Fehler bekommen. Soll ich meine Frage bearbeiten und den nötigen Quellcode darin eingeben oder hast du noch einen Hinweis? – Niklas
Wenn Sie das Makro hinzufügen, führen Sie qmake erneut aus. Es muss Ihre Dateien nach dem Makro durchsuchen, um zu wissen, dass es "moc" darauf ausführen muss. Eine weitere Falle von Qt ...;) – leemes