Seite 1 von 1

Icons werden nicht geladen

Verfasst: 4. Februar 2011 22:56
von t_b
Hallo,

Ich weiss, das es dutzende Beiträge zu diesem Thema hier gibt, und ich habe auch schon alle durch. Ich habe mir
http://doc.qt.nokia.com/latest/resources.html angeschaut und auch die dazugehörige Beispielapplikation http://doc.qt.nokia.com/latest/mainwind ... ation.html.
Ich habe so alles befolgt, wie es darin und in den Beiträgen stand, dennoch bekomme ich es nicht hin, das die Icons mitgeladen werden.

Die Resourcendatei liegt im Basisverzeichnis, während die Applikation im Unterverzeichnis main liegt. Diese habe ich über den UI-Designer erstellt und die Icons auch über den Designer eingebunden.
Was mich gerade ein wenig stutzig werden lässt, ist die Tatsache, dass die "qrc_fixtestpc.cpp" 2.22MB groß ist, die dazugehörige "fixtestpc.exe" aber gerade mal 1.04mb, was mich davon ausgehen lässt, das diese nicht mit einkompiliert wird.

die entsprechenden dateien sehen folgendermaßen aus:

main.cpp

Code: Alles auswählen

#include "maindialog.h"
#include "debughandler.h"
#include <QtGui/QApplication>
#include <QWidget>

int main( int argc, char* argv[] ) {

    Q_INIT_RESOURCE(fixtestpc);
    QApplication app( argc, argv );
    QFont newFont("Ubuntu", 12);
    QApplication::setFont(newFont);

    if (app.arguments().contains("-D"))
    {
        qInstallMsgHandler(debugWinMsgHandler);
    }

   MainDialog *dialog = new MainDialog;
   dialog->show();

   return app.exec();
}
fixtestpc.qrc

Code: Alles auswählen

<!DOCTYPE RCC>
<RCC version="1.0">
    <qresource>
        <file alias="application-exit-small">images/16/application-exit.svg</file>
        <file alias="scale-small">images/16/applications-accessories.svg</file>
        <file alias="time-small">images/16/appointment.svg</file>
        <file alias="dialog-apply-small">images/16/dialog-apply.svg</file>
        <file alias="dialog-error-small">images/16/dialog-error.svg</file>
        [...]
    </qresource>
</RCC>
main.pro

Code: Alles auswählen

TEMPLATE = app

TARGET = fixtestpc

include($$PWD/../configfile/configfile.pri)
include($$PWD/../configdialog/configdialog.pri)
include($$PWD/../debugwindow/debugwindow.pri)
include($$PWD/../evaluationdialog/evaluationdialog.pri)
include($$PWD/../keyutils/keyutils.pri)
include($$PWD/../profiledialog/profiledialog.pri)
include($$PWD/../profilefile/profilefile.pri)
include($$PWD/../settingsfile/settingsfile.pri)
include($$PWD/../logfile/logfile.pri)
#include($$PWD/../graphicswidget/graphicswidget.pri)

SOURCES += main.cpp \
    maindialog.cpp

HEADERS += \
    maindialog.h

FORMS += \
    maindialog.ui

RESOURCES *= \
    $$PWD/../fixtestpc.qrc

RC_FILE *= \
    $$PWD/../fixtestpc.rc
fixtestpc.pro

Code: Alles auswählen

TEMPLATE = subdirs

CONFIG += ordered

EXTRAS = settingsfile profilefile profiledialog evaluationdialog graphicswidget configdialog debugwindow keyutils main
for(dir, EXTRAS) {
    exists($$dir) {
        SUBDIRS += $$dir
    }
}

ich verzweifel hier noch...

Verfasst: 4. Februar 2011 23:36
von Christian81
Q_INIT_RESOURCES ist nicht nötig (siehe auch http://doc.qt.nokia.com/latest/qdir.htm ... T_RESOURCE )
Wo und wie versuchst Du die Icons zu laden?
Funktioniert es mit einem ganz kleinen Programm (Stichwort: minimales Testcase)?

Verfasst: 4. Februar 2011 23:47
von t_b
Ja, ich habe es eben noch einmal getestet. Auch bei einem ganz kleinen Projekt (ich habe ein neues GUI-Projekt erstellt, meinen Icon-Ordner und die qrc kopiert und eingebunden) werden diese nicht geladen.

UPDATE: es scheint an den svg Dateien zu liegen, aber fragt mich nicht warum, ich liefere die QtSvg4.dll und die qsvg4.dll mit.

Verfasst: 5. Februar 2011 01:12
von t_b
Update 2: Ich habe es jetzt auch mit dem qt.conf tipp von hier

http://stackoverflow.com/questions/3434 ... ith-py2exe

probiert.

Ich habe dazu zusätzlich

Code: Alles auswählen

#include <QLibraryInfo> 
eingebunden

und dann entspechende diese struktur verwendet:

Code: Alles auswählen

    app.exe
    qt.conf
    plugins/
        imageformats/
            qsvg4.dll
wobei die qt.conf folgendermaßen aussieht:

Code: Alles auswählen

[Paths]
Plugins = plugins
Ich habe auch noch andere Pfadvarianten versucht, ebenfalls ohne Erfolg

Verfasst: 5. Februar 2011 10:09
von Christian81
Hast Du die Qt4-Dlls verschoben nachdem Du sie installiert/kompiliert hast oder was genau hast du gemacht?
Die qt.conf ist überflüssig - siehe Foren-Suche 'Plugins' und http://doc.trolltech.com/4.7/deployment-plugins.html

Verfasst: 5. Februar 2011 10:28
von t_b
Ja, ich habe mir einen Installer mit den benötigten Abhängigkeiten gebaut.

Code: Alles auswählen

Section "FixTestPC" SecFixTestPC
SectionIN RO

  SetOutPath "$INSTDIR"
  
  File "..\..\fixtestpc-build-desktop\main\release\fixtestpc.exe"
  CreateShortCut "$Desktop\FixTestPC.lnk" "$OUTDIR\fixtestpc.exe"
  CreateDirectory "$SMPROGRAMS\FixTestPC"
  CreateShortCut "$SMPROGRAMS\FixTestPC\FixTestPC.lnk" "$OUTDIR\fixtestpc.exe"
  CreateShortCut "$SMPROGRAMS\FixTestPC\FixTestPC - Debug.lnk" "$OUTDIR\fixtestpc.exe -D"
  
  ;Store installation folder
  WriteRegStr HKCU "Software\FixTestPC" "" $INSTDIR
  
  ;Create uninstaller
  WriteUninstaller "$INSTDIR\Uninstall.exe"
  CreateShortCut "$SMPROGRAMS\FixTestPC\FixTestPC - Deinstallieren.lnk" "$OUTDIR\Uninstall.exe"

SectionEnd

Section "Bibliotheken" SecLibrary
SectionIN RO

  File "C:\Qt\2010.05\qt\bin\libgcc_s_dw2-1.dll"
  File "C:\Qt\2010.05\qt\bin\mingwm10.dll"
  File "C:\Qt\2010.05\qt\bin\QtCore4.dll"
  File "C:\Qt\2010.05\qt\bin\QtGui4.dll"
  File "C:\Qt\2010.05\qt\bin\QtOpenGL4.dll"
  File "C:\Qt\2010.05\qt\bin\QtSql4.dll"
  File "C:\Qt\2010.05\qt\bin\QtSvg4.dll"

SectionEnd
Allerdings würde es ja funktionieren, wenn ich pngs nutze... ich habe das getestet, es hat sowohl in der Qt TechDemo (mainwindows/application) als auch in meinem minimal testcase funktioniert, sobald ich auf png umgestiegen bin.. ich bin aber dummerweise mehr oder weniger auf die svgs angewiesen

Verfasst: 5. Februar 2011 11:06
von Christian81
Deshalb habe ich ja den Link gepostet... dort steht wie es zu machen ist und auch die Foren-Suche bringt dich weiter.
Qt-Dou hat geschrieben: When the application is run, Qt will first treat the application's executable directory as the pluginsbase. For example if the application is in C:\Program Files\MyApp and has a style plugin, Qt will look in C:\Program Files\MyApp\styles.

Verfasst: 5. Februar 2011 11:11
von franzf
Ich seh das grad zum ersten mal:
Es gibt neben dem plugins/imageformats auch noch plugins/iconengines, dort liegt ein libqsvgicon.so (Linux).
Ich nehm an das ist unter Windows genauso. Liefer diese IconEngine mit und es sollte passen. Eine IconEngine für png brauchts wohl nicht.

Verfasst: 5. Februar 2011 11:17
von t_b
Das ist ja das Problem, ich liefere es mit und es funktioniert nicht.
Ich habe es im Applikationsverzeichnis \ versucht, im Verzeichnis \plugins, im verzeichnis \plugins\imageformats sowie im Verzeichnis \imageformats

Verfasst: 5. Februar 2011 11:47
von Christian81
Wenn das Plugin in <executable-path>\imageformats liegt und alle Dependencies vorhanden sind (was bei Dir demnach nicht der Fall ist - und bevor du fragst anstatt zu suchen -> Dependency Walker) dann funktioniert es auch.

Verfasst: 5. Februar 2011 12:13
von t_b
Der Dependency Walker war eines der ersten Sachen, die ich versucht habe. Alle Abhängigkeiten sind aufgelöst.

Ich habe es jetzt allerdings im via Ausschlussverfahren hinbekommen... ich habe alle dateien (und damit meine ich alle) aus dem qt Verzeichnis hinzugefügt, und nach und nach rausgenommen.

Ende der Geschichte:

Die QtXml4.dll wird anscheinend auch benötigt, um svg-Dateien (eigentlich logisch, sind doch svg Dateien nichts anderes). Merkwürdigerweie springt der Dependency Walker nicht darauf an.

Verfasst: 5. Februar 2011 13:18
von Christian81
Wenn man mit dem Dependency Walker das qsvg4.dll - Plugin (und darum gehts ja) anschaut sieht man das schon ...

Verfasst: 16. Februar 2011 20:48
von t_b
Nicht, wenn der Dependency Walker die QtSql4.dll nicht als Abhängigkeit anzeigt. Ich habe jetzt das Problem, das es zwar auf meinem System funktioniert, aber auf anderen Systemen nicht...
Der Dependency Walker zeigt nur die Folgdenen Abhängigkeiten an:

KERNEL32.DLL
MINGWM10DLL
MSVCRT.DLL
LIBGCC_S_DW2-1.DLL
QTCORE4.DLL
QTGUI4.DLL
QTOPENGL4.DLL
QTSQL4.DLL

Sobald ich aber auf einem anderen System das Packet installiere, habe ich sowohl ein SQL-Treiberproblem, als auch das die Icons wieder nicht da sind.
Auch das Hinzufügen des plugin Verzeichnisses hat nichts gebracht.

Verfasst: 17. Februar 2011 12:22
von franzf
Die QtSvg ist natürlich keine direkte Abhängigkeit. Dein Programm braucht nur das icon-Plugin, dieses braucht dann wiederum die QtSvg.dll.

Verfasst: 17. Februar 2011 18:05
von t_b
Ok, ich habe es jetzt hinbekommen. Nach

Code: Alles auswählen

QApplication app( argc, argv );
habe ich die folgenden Zeilen hinzugefügt:

Code: Alles auswählen

    QStringList libPaths = QCoreApplication::libraryPaths();
    libPaths << QCoreApplication::applicationDirPath() + QString("/plugins");
    QCoreApplication::setLibraryPaths(libPaths);
Danach müssen die entsprechenden Plugins in das Verzeichnis kopiert werden, also in
  • INSTALL/plugins/iconengines/
    INSTALL/plugins/sqldrivers
und schon funktioniert das Ganze...