[Qt] PNG von Resource via QPixmap laden



  • Hallo,

    ich habe derzeit ein kleines Problem mit den Resourcen. Undzwar möchte ich eine PNG-Datei, die ich mittels QtCreator als Resource hinzugefügt habe anzeigen.
    Nur leider will es nicht klappen. Wenn ich von einer vorhandenen Datei (absoluter Pfad) das Bild laden möchte klappt dies Problemlos. Hier mal der Code mitwelchem ich das Bild lade:

    QPixmap image;
    image.load(":/common/data/test.png");
    ui->imgBox1->setPixmap(image);
    

    Irgendjemand eine Idee was ich daran ändern muss, oder was ich noch machen muss, damit es klappt?



  • Der Pfad passt wohl nicht. Zeig mal deine pro oder qrc, wo das Bild als Ressource eingebunden wird.



  • Hier die Pro:

    QT       += core gui
    
    greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
    
    TARGET = QtTest
    TEMPLATE = app
    
    SOURCES += main.cpp\
            mainwindow.cpp
    
    HEADERS  += mainwindow.h \
        names.h \
        send.h
    
    FORMS    += mainwindow.ui
    
    RESOURCES += \
        common.qrc
    
    OTHER_FILES +=
    

    Hier die qrc:

    <RCC>
        <qresource prefix="/common">
            <file>data/test.png</file>
        </qresource>
    </RCC>
    


  • Schaut auf den ersten Blick richtig aus. Evtl. musst du noch in der main

    Q_INIT_RESOURCE(name_der_qrc_ohne_.qrc);

    aufrufen.



  • Wenn ich Q_INIT_RESOURCE() aufrufe, bekomme ich einen Linker-Error:

    mainwindow.obj:-1: Fehler: LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""int __cdecl qInitResources_common(void)" (?qInitResources_common@@YAHXZ)" in Funktion ""public: __thiscall MainWindow::MainWindow(class QWidget *)" (??0MainWindow@@QAE@PAVQWidget@@@Z)".
    

    Google hat mir auch nichts nennenswertes ausgespuckt.



  • Hiao schrieb:

    Google hat mir auch nichts nennenswertes ausgespuckt.

    Schau mal, ob dir das hilft:

    https://qt-project.org/forums/viewthread/12548

    Q_INIT_RESOURCE braucht man eigentlich nur bei statischen Bibliotheken. So wirklich klar ist mir grad nicht, ob du das brauchst und warums bei dir nicht geht, ich hatte da bisher aber auch keine Probleme.



  • Ich glaube auch gelsesen zu haben, dass es dies Automatisch macht, und man im Normalfall eigentlich nichts mehr machen muss.

    common.qrc ist als Resource im QtCreator hinzugefügt worden, bzw. erstellt worden.

    Das Problem scheint mir auch sehr komisch, da man im Internet auch nicht wirklich viel darüber findet.
    Gäbe es noch eine Möglichkeit, dies über "normale" Resourcen, sprich .rc zu lösen. Wenn es wirklich keinen Ausweg gibt, dann würde ich immer noch diesen haben.

    P.S. ich hab Qt 5.3.1, also die neueste Version.



  • Hiao schrieb:

    Gäbe es noch eine Möglichkeit, dies über "normale" Resourcen, sprich .rc zu lösen.

    Ja, aber nicht so einfach. Das schöne an den Qt Resourcen ist ja, dass sie als virtuelles Dateisystem eingebunden werden und man direkt darauf zugreifen kann. Wenn du das als "normale" Ressource einbindest, musst du wahrscheinlich auch die Windows API benutzen, um an die Binärdaten zu kommen und dann erst daraus ein QPixmap erzeugen, also viel umständlicher.
    Qt 5 unterstützt QFileSystem Framework nicht mehr, vielleicht hat sich da was geändert, wobei das Laden der Ressourcen noch genauso wie früher funktionieren müsste. Ich kenne Qt 5 nicht wirklich, wir arbeiten mit 4.x und werden wahrscheinlich auch dabei bleiben. Vielleicht kann dir noch einer helfen, der sich mit Qt 5 besser auskennt, falls das daran liegt.



  • Hoffentlich können wir das Problem finden...

    Ich habe evtl. noch einen kleinen Hinweis. Undzwar, wenn ich das Programm mit 7-Zip öffne, finde ich keine Resourcen vor. Auch vergrößert sich das Programm nicht, wenn ich Resourcen hinzufüge. Da muss doch etwas faul sein...



  • Zeig mal bitte die komplette compiler ausgabe, wenn du das project neu baust.
    Wenn die Einbindung der common.qrc in das project korrekt ist, sollten in der Ausgabe zum einen folgende Zeilen auftauchen:

    rcc -name common common.qrc -o qrc_common.cpp
    

    bzw. Später sollte dann die qrc_common.cpp vom compiler übersetzt werden.



  • Hier die Compiler-Ausgabe:

    09:06:45: Führe Schritte für Projekt Test aus...
    09:06:45: Unveränderte Konfiguration, qmake-Schritt wird übersprungen.
    09:06:45: Starte "D:\Programme\Qt\Qt5.3.1\Tools\QtCreator\bin\jom.exe" 
    	D:\Programme\Qt\Qt5.3.1\Tools\QtCreator\bin\jom.exe -f Makefile.Debug
    	cl -c -nologo -Zm200 -Zc:wchar_t -Zi -MDd -GR -W3 -w34100 -w34189 -EHsc /Fddebug\Test.pdb -DUNICODE -DWIN32 -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I"D:\Programme\Qt\Qt5.3.1\5.3\msvc2012_opengl\include" -I"D:\Programme\Qt\Qt5.3.1\5.3\msvc2012_opengl\include\QtWidgets" -I"D:\Programme\Qt\Qt5.3.1\5.3\msvc2012_opengl\include\QtGui" -I"D:\Programme\Qt\Qt5.3.1\5.3\msvc2012_opengl\include\QtCore" -I"debug" -I"." -I"." -I"D:\Programme\Qt\Qt5.3.1\5.3\msvc2012_opengl\mkspecs\win32-msvc2012" -Fodebug\ @C:\Users\ABC\AppData\Local\Temp\main.obj.3876.16.jom
    main.cpp
    	D:\Programme\Qt\Qt5.3.1\5.3\msvc2012_opengl\bin\moc.exe -DUNICODE -DWIN32 -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -D_MSC_VER=1700 -D_WIN32 -ID:/Programme/Qt/Qt5.3.1/5.3/msvc2012_opengl/mkspecs/win32-msvc2012 -IC:/Users/ABC/Dropbox/Programmieren/Projects/Qt/Test -ID:/Programme/Qt/Qt5.3.1/5.3/msvc2012_opengl/include -ID:/Programme/Qt/Qt5.3.1/5.3/msvc2012_opengl/include/QtWidgets -ID:/Programme/Qt/Qt5.3.1/5.3/msvc2012_opengl/include/QtGui -ID:/Programme/Qt/Qt5.3.1/5.3/msvc2012_opengl/include/QtCore -I. ..\Test\mainwindow.h -o debug\moc_mainwindow.cpp
    	cl -c -nologo -Zm200 -Zc:wchar_t -Zi -MDd -GR -W3 -w34100 -w34189 -EHsc /Fddebug\Test.pdb -DUNICODE -DWIN32 -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I"D:\Programme\Qt\Qt5.3.1\5.3\msvc2012_opengl\include" -I"D:\Programme\Qt\Qt5.3.1\5.3\msvc2012_opengl\include\QtWidgets" -I"D:\Programme\Qt\Qt5.3.1\5.3\msvc2012_opengl\include\QtGui" -I"D:\Programme\Qt\Qt5.3.1\5.3\msvc2012_opengl\include\QtCore" -I"debug" -I"." -I"." -I"D:\Programme\Qt\Qt5.3.1\5.3\msvc2012_opengl\mkspecs\win32-msvc2012" -Fodebug\ @C:\Users\ABC\AppData\Local\Temp\mainwindow.obj.3876.157.jom
    mainwindow.cpp
    	cl -c -nologo -Zm200 -Zc:wchar_t -Zi -MDd -GR -W3 -w34100 -w34189 -EHsc /Fddebug\Test.pdb -DUNICODE -DWIN32 -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I"D:\Programme\Qt\Qt5.3.1\5.3\msvc2012_opengl\include" -I"D:\Programme\Qt\Qt5.3.1\5.3\msvc2012_opengl\include\QtWidgets" -I"D:\Programme\Qt\Qt5.3.1\5.3\msvc2012_opengl\include\QtGui" -I"D:\Programme\Qt\Qt5.3.1\5.3\msvc2012_opengl\include\QtCore" -I"debug" -I"." -I"." -I"D:\Programme\Qt\Qt5.3.1\5.3\msvc2012_opengl\mkspecs\win32-msvc2012" -Fodebug\ @C:\Users\ABC\AppData\Local\Temp\moc_mainwindow.obj.3876.313.jom
    moc_mainwindow.cpp
    ..\Test\mainwindow.cpp(78) : warning C4100: 'arg1': Unreferenzierter formaler Parameter
    ..\Test\mainwindow.cpp(82) : warning C4100: 'arg1': Unreferenzierter formaler Parameter
    	echo 1 /* CREATEPROCESS_MANIFEST_RESOURCE_ID */ 24 /* RT_MANIFEST */ "debug\\Test.exe.embed.manifest">debug\Test.exe_manifest.rc
    	if not exist debug\Test.exe if exist debug\Test.exe.embed.manifest del debug\Test.exe.embed.manifest
    	if exist debug\Test.exe.embed.manifest copy /Y debug\Test.exe.embed.manifest debug\Test.exe_manifest.bak
            1 Datei(en) kopiert.
    	link /NOLOGO /DYNAMICBASE /NXCOMPAT /DEBUG /SUBSYSTEM:WINDOWS "/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*'" /MANIFEST /MANIFESTFILE:debug\Test.exe.embed.manifest /OUT:debug\Test.exe @C:\Users\ABC\AppData\Local\Temp\Test.exe.3876.1469.jom
    	if exist debug\Test.exe_manifest.bak fc /b debug\Test.exe.embed.manifest debug\Test.exe_manifest.bak >NUL || del debug\Test.exe_manifest.bak
    	if not exist debug\Test.exe_manifest.bak rc.exe /fodebug\Test.exe_manifest.res debug\Test.exe_manifest.rc
    	if not exist debug\Test.exe_manifest.bak link /NOLOGO /DYNAMICBASE /NXCOMPAT /DEBUG /SUBSYSTEM:WINDOWS "/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*'" /MANIFEST /MANIFESTFILE:debug\Test.exe.embed.manifest /OUT:debug\Test.exe @C:\Users\ABC\AppData\Local\Temp\Test.exe.3876.1485.jom
    	if exist debug\Test.exe_manifest.bak del debug\Test.exe_manifest.bak
    09:06:46: Der Prozess "D:\Programme\Qt\Qt5.3.1\Tools\QtCreator\bin\jom.exe" wurde normal beendet.
    09:06:47: Verstrichene Zeit: 00:02.
    

    Die von Dir genannte Zeile taucht jedoch nicht auf.



  • Das beduetet, dass dein gezeigter abschnitt der pro datei nicht mit dem tatsächlich verwendeten übereinstimmt! Oder vergessen wurde nach der Änderung der datei qmake neu auszuführen.

    Welche IDE verwendest du? Wenn es der qtcreator ist, dann sollte dies automatisch passieren



  • Ja, ich verwende den Qt Creator.



  • Problem wurde nach einigen Neustarts von selbst aus der Welt geschaffen. Womöglich musste Qt einige Sachen noch vorbereiten, ansonsten kann ich mir es nicht erklären.

    Trotzdem noch vielen Dank für die Hilfreichen Antworten 🙂



  • Hiao schrieb:

    ansonsten kann ich mir es nicht erklären.

    Wahrscheinlich wurde qmake nicht ausgeführt, wie firefly geschrieben hat. Ich weiß nicht, wie Qt Creator das macht. Ich arbeite mit Visual Studio und qmake rufe ich von Hand auf.



  • Das wird es vermutlich auch gewesen sein. Vllt. war da einfach kurzfristig der Wurm drin.

    Auch wenn es zu sehr ins Off-Topic geht, hätte ich noch eine Frage wie die ganze Sache in Visual Studio aussieht. Soviel ich weiß, gibt es ein "Plug-In" für Visual Studio, das Qt sozusagen einrichtet.
    Aber wie geht das dann ohne Plug-In? Oder benutzt ihr auch das Plug-In?



  • Ich benutze das Plugin nicht direkt. Ich hatte es früher mal installiert in der Arbeit, aber eigentlich nur wegen den Debugger Visualisierungen für Qt Typen. Dafür braucht man aber das Plugin nicht, in letzter Zeit kopier ich mir einfach nur die autoexp.dat, das reicht schon.
    Man muss nichts "einrichten". Die pro und pri Dateien schreiben wir von Hand, und qmake generiert daraus Visual Studio Projekte (wir haben qmake eh schon ziemlich stark angepasst und erweitert). Das wird dann von Hand aufgerufen, wenn man das braucht.



  • Gut zu wissen, viel Dank. 🙂


Anmelden zum Antworten