[Qt] PNG von Resource via QPixmap laden
-
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.