[Qt] Problem mit Verebung und Q_OBJECT
-
Hallo community. Ich habe eine Klasse Database die so aussieht:
#include <QDialog> #include "ui_userdb.h" class Database : public QDialog { Q_OBJECT public: Database(QWidget* parent = 0); virtual ~Database(); protected: Ui::Userdb ui_; protected: virtual void SetupModel() = 0; };
ui_ ist ein Dialog der mit dem Designer erstellt wurde. Der Konstruktor ist dieser hier:
Database::Database(QWidget* parent) : QDialog(parent) { ui_.setupUi(this); }
Nun mochte ich eine Klasse Account von Database erben:
#include "database.h" class Account : public Database { Q_OBJECT public: explicit Account(QWidget* parent = 0); private: virtual void SetupModel(); private slots: void Submit(); };
Und hier(?) fangen die Probleme an. Das Programm laesst sich nicht kompillieren. Es sind die folgenden komischen Fehlermeldungen:
account.obj
error: unresolved external symbol "public: virtual struct QMetaObject const * __thiscall Account::metaObject(void)const " (?metaObject@Account@@UBEPBUQMetaObject@@XZ)
account.objerror: unresolved external symbol "public: virtual void * __thiscall Account::qt_metacast(char const *)" (?qt_metacast@Account@@UAEPAXPBD@Z)
account.objerror: unresolved external symbol "public: virtual int __thiscall Account::qt_metacall(enum QMetaObject::Call,int,void * *)" (?qt_metacall@Account@@UAEHW4Call@QMetaObject@@HPAPAX@Z)
account.objerror: unresolved external symbol "public: static struct QMetaObject const Account::staticMetaObject" (?staticMetaObject@Account@@2UQMetaObject@@B)
In MainWindow wollte ich die Klasse so benutzen:
QScopedPointer<Database> acc(new Account); acc -> exec();
Wenn ich das Q_OBJECT macro von der Account-Klasse wegkommentiere laesst sich zwar die Anwendung ausfuhren kann aber keine slots benutzen. Wenn ich das Q_OBJECT macro von der Database-Klasse wegkommentiere erscheinen dieselben Fehlermeldungen wie oben. Eigentlich wollte ich viele Klassen haben die die selbe Designer-Form benutzen. Deswegen habe ich mir gedacht ein einhaltliches interface zu implementieren von dem die verschiedene Klassen dann erben. Leider kann ich mir nicht mit meinem Problem weiterhelfen. Ist es moeglich Vererbung im Zusammenhang mit dem Q_OBJECT macro zu benutzen, so wie ich es vorhabe, oder sollte ich die verschiedenen Klassen ohne Vererbung implementieren?
-
rein vom Prinzip seh ich keinen Fehler.
In 95% der Fälle hast du einfach vergessen qmake auszuführen, nachdem du einer Klasse nachträglich das Q_OBJECT-Makro hinzugefügt hast