2014-07-08 3 views
7

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?

+0

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

+0

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

+0

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

Antwort

15

QMetaObject::invokeMethod können nur Methoden, um die Qt Meta-Objekt-System bekannt aufzurufen. Dies sind Schlitze und „aufrufbare“ Funktionen, wobei die letzteren Funktionen mit dem Schlüsselwort Q_INVOKABLE vor ihnen.

Also entweder schreiben:

class Item : public Common { 
    Q_OBJECT 

public slots: 
    // ^^^^^ 
    void test(QString value); 
}; 

oder:

class Item : public Common { 
    Q_OBJECT 

public: 
    Q_INVOKABLE void test(QString value); 
    //^^^^^^^^^ 
}; 
+0

'Q_INVOKABLE void test (QString-Wert);' tat es für mich. Vielen Dank! – Niklas

+1

@ Niklas Ja, ich habe es in einer Bearbeitung hinzugefügt :) Ich bevorzuge 'Q_INVOKABLE' über Steckplätze, wenn die Funktion nie in einer Signal-Slot-Verbindung verwendet wird. Aber für viele Funktionen sagt "public slots:' einfach weniger ":) – leemes

Verwandte Themen