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!


Anmelden zum Antworten