Icons werden nicht geladen

Alles rund um die Programmierung mit Qt
Antworten
t_b
Beiträge: 41
Registriert: 27. Februar 2010 14:12

Icons werden nicht geladen

Beitrag 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...
Zuletzt geändert von t_b am 16. Februar 2011 20:40, insgesamt 2-mal geändert.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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)?
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
t_b
Beiträge: 41
Registriert: 27. Februar 2010 14:12

Beitrag 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.
t_b
Beiträge: 41
Registriert: 27. Februar 2010 14:12

Beitrag 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
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
t_b
Beiträge: 41
Registriert: 27. Februar 2010 14:12

Beitrag 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
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag 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.
t_b
Beiträge: 41
Registriert: 27. Februar 2010 14:12

Beitrag 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
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
t_b
Beiträge: 41
Registriert: 27. Februar 2010 14:12

Beitrag 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.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Wenn man mit dem Dependency Walker das qsvg4.dll - Plugin (und darum gehts ja) anschaut sieht man das schon ...
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
t_b
Beiträge: 41
Registriert: 27. Februar 2010 14:12

Beitrag 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.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag 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.
t_b
Beiträge: 41
Registriert: 27. Februar 2010 14:12

Beitrag 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...
Antworten