it-swarm.com.de

Nicht-Qt-Basisklassen

Ich verwende Qt (mit dem ich neu bin) 4.8.2 mit Visual Studio und habe eine Basisklasse mit dem Namen "Contact" erstellt. Ich möchte nicht, dass diese Klasse Qt-exklusiv ist , daher bestand meine Absicht darin, eine weitere Klasse "QContact" zu erstellen, die "Contact" und "QObject" erbt und sich mit allen Qt-bezogenen Geschäften befasst, wie z Q_OBJECT-Makro usw.

Leider ist der Build bei meiner Vererbung fehlgeschlagen.

moc_QContact.cpp(53): error C2039: 'staticMetaObject' : is not a member of 'Contact'
moc_QContact.cpp(75): error C2039: 'qt_metacast' : is not a member of 'Contact'
moc_QContact.cpp(80): error C2039: 'qt_metacall' : is not a member of 'Contact'

Ich habe ein wenig im Internet recherchiert und herausgefunden, dass Sie keine Qt-Klasse von einer Nicht-Qt-Klasse ableiten können. Um es zu beheben, könnte "Contact" "QObject" erben (ich habe es versucht, es hat funktioniert). Aber dies macht es exklusiv für Qt, was mein Problem ist.

Ich frage also: Wie kann man eine Nicht-Qt-Basisklasse für eine Qt-Klasse erstellen?

Vielen Dank.

40
MasterMastic

Sie können Ihre Klasse von QObject und von anderen Klassen ableiten, die nicht von ihr abgeleitet sind, aber QObject muss die erste Basisklasse in der Basisklassenliste sein. 

Das ist also falsch:

class QContact: public Contact, public QObject {};

Sie müssen es als schreiben

class QContact: public QObject, public Contact {};

Von Eine Einführung in die Gestaltung von Pattern in C++ mit Qt Kapitel 8.4:

Um sicherzustellen, dass die Moc-Prozesse für jede QObject-abgeleitete Klasse im Projekt Verarbeitet werden, sind im Folgenden einige Richtlinien zum Schreiben aufgeführt: C++ - Code und qmake-Projektdateien:

• Jede Klassendefinition sollte in einer eigenen .h-Datei gespeichert werden.

• Die Implementierung sollte in einer entsprechenden CPP-Datei gespeichert werden.

• Die Header-Datei sollte "umschlossen" sein (z. B. mit #ifndef), um Mehrfacheinträge zu vermeiden. • Jede .cpp-Datei sollte in der Variablen SOURCES der Projektdatei aufgeführt sein, andernfalls wird nicht kompiliert.

• Jede Header-Datei sollte in der HEADERS-Variablen der .pro-Datei aufgeführt sein. Ohne diese Option wird die Datei von moc nicht vorverarbeitet.

• Das Q_OBJECT-Makro muss in der Klassendefinition jeder abgeleiteten Header-Datei von QObject Enthalten sein, damit moc weiß, dass es Code generiert.

0