Eigene QIcon-Klasse macht Probleme
-
Hi,
ich wollte eine eigene QIcon-Klasse basteln. Leider funktioniert das nicht so, wie ich gerne möchte:
class Card : public QIcon { Q_OBJECT public: Card(QPixmap pixmap, Value newValue, Suit newSuit) : value(newValue), suit(newSuit) { addPixmap(pixmap); } Suit GetSuit() const {return suit;} Value GetValue() const {return value;} virtual QMetaObject const* metaObject() const {return 0;} private: Value value; Suit suit; };
Wenn ich das Ding benutzen möchte, erhalte ich aber haufenweise Linkerfehler:
`
1>CardFactory.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""public: virtual struct QMetaObject const * __thiscall Card::metaObject(void)const " (?metaObject@Card@@UBEPBUQMetaObject@@XZ)".
1>CardFactory.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""public: virtual void * __thiscall Card::qt_metacast(char const *)" (?qt_metacast@Card@@UAEPAXPBD@Z)".
1>CardFactory.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""public: virtual int __thiscall Card::qt_metacall(enum QMetaObject::Call,int,void * *)" (?qt_metacall@Card@@UAEHW4Call@QMetaObject@@HPAPAX@Z)".
1>CardFactory.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""public: virtual struct QMetaObject const * __thiscall Hand::metaObject(void)const " (?metaObject@Hand@@UBEPBUQMetaObject@@XZ)".
1>CardFactory.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""public: virtual void * __thiscall Hand::qt_metacast(char const *)" (?qt_metacast@Hand@@UAEPAXPBD@Z)".
1>CardFactory.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""public: virtual int __thiscall Hand::qt_metacall(enum QMetaObject::Call,int,void * *)" (?qt_metacall@Hand@@UAEHW4Call@QMetaObject@@HPAPAX@Z)".
1>CardTable.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""public: virtual struct QMetaObject const * __thiscall CardTable::metaObject(void)const " (?metaObject@CardTable@@UBEPBUQMetaObject@@XZ)".
1>CardTable.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""public: virtual void * __thiscall CardTable::qt_metacast(char const *)" (?qt_metacast@CardTable@@UAEPAXPBD@Z)".
1>CardTable.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""public: virtual int __thiscall CardTable::qt_metacall(enum QMetaObject::Call,int,void * *)" (?qt_metacall@CardTable@@UAEHW4Call@QMetaObject@@HPAPAX@Z)".
1>-.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""public: virtual struct QMetaObject const * __thiscall -::metaObject(void)const " (?metaObject@-@@UBEPBUQMetaObject@@XZ)".
1>-.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""public: virtual void * __thiscall -::qt_metacast(char const *)" (?qt_metacast@-@@UAEPAXPBD@Z)".
1>-.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""public: virtual int __thiscall -::qt_metacall(enum QMetaObject::Call,int,void * *)" (?qt_metacall@-@@UAEHW4Call@QMetaObject@@HPAPAX@Z)".
1>-.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""public: virtual struct QMetaObject const * __thiscall HandRange::metaObject(void)const " (?metaObject@HandRange@@UBEPBUQMetaObject@@XZ)".
1>-.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""public: virtual void * __thiscall HandRange::qt_metacast(char const *)" (?qt_metacast@HandRange@@UAEPAXPBD@Z)".
1>-.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""public: virtual int __thiscall HandRange::qt_metacall(enum QMetaObject::Call,int,void * *)" (?qt_metacall@HandRange@@UAEHW4Call@QMetaObject@@HPAPAX@Z)".
1>C:\Users\Michael\documents\visual studio 2010\Projects\UI\-.exe : fatal error LNK1120: 15 nicht aufgelöste externe Verweise.`
Ich weiß aber nicht, was ich tun soll, um metaObject verfügbar zu machen. Irgendein fancy QT-Makro?
-
Okay, Fehler war, dass QIcon gar kein Q_OBJECT ist, daher darf man das auch nicht in die eigene Klasse schreiben. Das hat nicht sofort funktioniert (nutze MSVC mit diesem Qt Addin); ich habe noch "alle ts updaten" gedrückt und neu erstellt und bin noch in die .ui-Dateien gegangen usw. irgendwann ging's.
Neues Problem: Meine Ressourcendatei funktioniert nicht mehr, ich kann nichts daraus laden. Im ui-Editor kann ich daraus was auswählen, das wird auch im UI-Editor angezeigt. Wenn ich das Programm starte, werden aber weder die UI eingestellten Bilder noch meine selbst erstellten Pixmaps mit Bildern initialisiert. Woran kann das liegen?
Edit: Okay, man sollte im Eifer des Gefechts, wenn man die generierten Dateien löscht, nicht unbedingt auch die qrt-*.cpp löschen.
Damit also alles gelöst. Hoffe, die Suche führt viele Hilfesuchenden hier zu ner Lösung. :p
-
Bei mir lioegt das immer am QtCreator. Einfach die qrc löschen, neue hinzufügen+Resourcen neu hinzufügen und auf bereinigen gehen. Dann klappt es bei mir immer...einer der seltenen Bugs des QtCreators^^
-
Okay, werd ich mir merken, danke.
-
Okay, diesmal kriege ich wieder diese blöden Linkerfehler und ich kriege sie auch nicht weg. Beim Projekt kann ich jetzt nicht Mal mehr auswählen, ob ich ts-Projekte releasen/updaten möchte (ausgegraut). Und alles bereinigen/neu erstellen hilft ebenfalls nicht. -.-
Ich weiß aber auch nicht, woher die Implementierungen kommen von diesen blöden meta-Methoden.
Hmm, wahrscheinlich aus diesen moc-Dateien. Ich habe die Buildeinstellungen der anderen ui-Datei für eine meiner neuen ui-Dateien (die nicht kompilierbar ist aus mir unerklärlichen Gründen -.-) kopiert! Keine Ahnung, wieso keine mocs erstellt werden. Ne Idee?
-
Ok, diese moc-Dateien sind's. Aber um die zu erstellen, muss ich bei jeder Headerdatei die Buildsachen einstellen, das dann über Rechtsklick kompilieren und die moc-Dateien manuell zum Projekt hinzufügen.
Geht das nicht einfacher? -.-
-
ja verwende qt-creator
oder es das qt-addin für MSVC könnte auch helfen.
-
Ich benutze doch die ganze Zeit schon das MSVC-Addin. Aber wenn ich normale Headerdateien hinzufüge, stellt der die Build-Einstellungen nicht ein. Muss ich das irgendwie anders hinzufügen?
-
Ich muss mich dem Hinweis von firefly anschließen. Nimm lieber den QtCreator. Der ist sehr einfach zu bedienen und verzeiht auch mal Fehler.
-
Klingt interessant, werde ich mir demnächst Mal anschauen.
Dennoch freue ich mich sehr, wenn mir jemand mit obigen Problemen helfen kann!