QIcon und der entsprechende pfad

Alles rund um die Programmierung mit Qt
Antworten
haldol
Beiträge: 19
Registriert: 18. April 2008 22:23

QIcon und der entsprechende pfad

Beitrag von haldol »

hallo,

ich habe hier ein problem mit der icon darstellung welches sehr wahrscheinlich am eingesetzten pfad liegt. ich nutze eclipse und solange ich mein programm daraus öffne, funktioniert die darstellung.
der image ordner mit den icons liegt im selben verzeichnis wie die quelldateien. dafür funktionieren bei der nutzung von eclipse folgende pfade:

Code: Alles auswählen

QIcon("./images/door_open.png")
QIcon("images/door_open.png")
ausserhalb der eclipse versagen beide. eine weitere möglichkeit, soll diese sein:

Code: Alles auswählen

QIcon(":/images/door_open.png")
leider wird in dem entsprechenden buch nicht beschrieben, woran sich dieser pfad orientiert - er funktionier hier überhaupt nicht.
das system auf dem ich arbeite ist ein linux, nach möglichkeit sollte das programm aber später auch auf windows laufen.
wie mache ich das also?

haldol
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Zum dritten Pfad gibts die Informationen in der Doku, nämlich beim Qt Resource System

Und die ersten beiden Pfade sind relativ zu dem Pfad zu sehen, von dem aus dein Binary gestartet wird.
haldol
Beiträge: 19
Registriert: 18. April 2008 22:23

Beitrag von haldol »

vielen dank, da findet sich alles, was ich zu dem thema wissen muss.
Exasperation
Beiträge: 186
Registriert: 11. März 2009 18:00
Wohnort: VS

Beitrag von Exasperation »

Hmm kann ich in ein QIcon auch ein Icon einfügen, dass ich mir aus der VS ressourcen datei *.rc hol? Bzw wie bewerkstellige ich das? Oder bin ich gezwungen das Qt Ressource System zu benutzen wenn ich in meiner exe Icons haben will ohne die separat mitschleppen zu müssen?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Wenn Du die Icons mittels ":/..." laden willst musst Du auch das Qt-Resourcensystem benutzen - ist nunmal eine Qt-Erweiterung. Wenn Du :/ nicht benutzen willst ist es Dir überlassen wo und wie Du Deine Icons lädst.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Exasperation
Beiträge: 186
Registriert: 11. März 2009 18:00
Wohnort: VS

Beitrag von Exasperation »

Okay dann mach ich das so.. ist ja auch nicht allzu schwer...

Mein einziges Problem ist, dass ich nicht weiß wie ich ne .pro Datei erstell... Kann ich mir die generieren lassen? Das mit den HEADERS und RESSOURCES ist ja noch einleuchtend.. aber diese Pfada im unteren Teil der pro Datei blick ich nivht ganz durch... ich hab mal ne Beispiel Datei genommen und den oberen Teil abgeändert... der untere Teil ist noch so wie vom Qt Beispiel:

Code: Alles auswählen

HEADERS       = main_window.hpp
SOURCES       = main.cpp \
                main_window.cpp
#! [0]
RESOURCES     = application.qrc
#! [0]

# install
target.path = $$[QT_INSTALL_EXAMPLES]/mainwindows/application
sources.files = $$SOURCES $$HEADERS $$RESOURCES $$FORMS application.pro images
sources.path = $$[QT_INSTALL_EXAMPLES]/mainwindows/application
INSTALLS += target sources
also ab #install hab ich nix mehr geändert...
Exasperation
Beiträge: 186
Registriert: 11. März 2009 18:00
Wohnort: VS

Beitrag von Exasperation »

Okay die .pro-Datei lässt sich erstellen indem man mit cmd in den ordner geht in dem das VS projekt liegt und dann qmake -project ausführt...

Allerdings kann ichs immer noch nicht erstellen.. kompilieren geht, aber dann beim builden gibts nen Linker-Fehler...

Code: Alles auswählen

1>main.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""int __cdecl qInitResources_application(void)" (?qInitResources_application@@YAHXZ)" in Funktion "_main".
1>C:\projects\transl_strip\transl_strip\Debug\transl_strip.exe : fatal error LNK1120: 1 nicht aufgelöste externe Verweise.
:?: Die Umgebungsvariablen etc. stimmen eigentlich...
Exasperation
Beiträge: 186
Registriert: 11. März 2009 18:00
Wohnort: VS

Beitrag von Exasperation »

So.. ich fass das jetzt mal kurz zusammen wie Ressourcen mit Qt verwaltet werden wenn man in C++ mit Visual Studio programmiert und nicht mit qmake kompiliert sondern direkt mit VS...

Eine .pro-Datei wie oben erwähnt braucht man nicht, sondern lediglich eine .qrc-Datei, in der man seine verwendeten Ressourcen (in meinem Fall .ico und .png Dateien) auflistet. Diese Datei sieht z.B. wie folgt aus:

Code: Alles auswählen

<!DOCTYPE RCC><RCC version="1.0">
 <qresource>
   <file>gfx/Icon_0.ico</file>
   <file>gfx/Icon_131.ico</file>
   <file>gfx/Icon_23.ico</file>
   <file>gfx/Icon_20.ico</file>
   <file>gfx/Icon_228.ico</file>
   <file>gfx/Icon_156.ico</file>
   <file>gfx/exit.png</file>
 </qresource>
 </RCC>
Die .qrc Datei erstellt ihr einfach im selben Ordner, in dem auch die Projektdatei liegt.

So, die Integration in euer Projekt erfolgt über eine .cpp, die ihr folgender maßen per Konsole erstellt. Oder schreibt euch am besten eine .bat, dann müsst ihr in der Konsole nicht erst in euren Ordner wechseln.

Code: Alles auswählen

rcc eure_ressourcen.qrc -o neue_datei.cpp
Die erstelle .cpp-Datei müsst ihr nun nur noch in euer Projekt aufnehmen.

Als Alternative bin ich grade dabei eine eigene Build-Regel für VS zu schreiben, damit ihr nicht selbst eine .cpp erstellen müsst, sondern dass die .qrc-Datei, in der ihr eure Ressourcen aufzählt automatisch zu einer .cpp kompiliert wird. Sollte für euch nicht allzu schwer sein.

/edit: So, ab sofort wird meine .qrc-Datei automatisch mit kompiliert und im Build verwendet :)
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag von RHBaum »

wenn du unbedingt beim MS Ressourcensystem bleiben willst, geht das natuerlich auch ....

Gibt dazu mehrere moglichkeiten.
eine ist:

mit LodIcon(LoadImage neuerdings), das ding aus den ressourcen holen.
DU hasst dann nen HIcon

mit GetIconInfo holst dir die IconInfo struktur zu dem HIcon ...

dann erzeugst nen neues QPixMap mittels QPixmap::fromWinHBITMAP();
die Colorbitmap steht in im hbmColor der IconInfo struktur.

Der Weg über die QT ressourcen ist natuerlich einfacher und fehlerunanfaelliger. wenn man kann sollt man das nutzen. Aber manchmal ist man halt auch an altlasten gebunden ....

Ciao ....
Antworten