qt4 uic will nicht so, wie ich wohl will



  • ich benutz qmake, um mir nen projekt kompilieren zu lassen.

    laut doc werden die ganzen nötigen "ui_*.h" header automatisch erstellt, wenn sie in einer unter SOURCES angegeben datei includiert werden.

    das funktioniert aber nur, wenn sich der include in der ersten unter SOURCES angegeben datei befindet.

    ist das absicht? käme mir bisschen dämlich vor.

    also in foobar.cpp ist beispielsweise der include.

    SOURCES += foobar.cpp main.cpp -> alles funzt, ui_foobar.h wird erstellt
    SOURCES += main.cpp foobar.cpp -> geht nicht, ui_foobar.h wird nicht erstellt



  • Hallo,

    laut meinen Beobachtungen werden die ui_* Dateien erstellt, wenn du sie das erste mal in deinem Programm einbindest.
    Damit das funktioniert, muss die .ui Definitionsfile per "FORMS = " eingebunden werden. Wenn du eine Datei erzeugst, die genau wie dein Form heißt und evtl. sogar von QDialog erbt, dann ist das optional und wird auch nicht weiter vom uic beachtet.
    Wie du deine Beobachtung wegen der Includereihenfolge gemacht hast, weiß ich nicht. Wie gesagt, der uic wird aktiv, wenn die Datei verwendet wird, nicht wenn sie als Parameter für make weitergegeben wird.



  • hm, kann nicht ganz nachvollziehen, was du da sagst.

    "das erste mal in dein programm einbinden" ... ich hab halt irgendwo nen #include "ui_foobar.h" drin.

    funktioniert das nur, wenn man mit dem designer entwickelt? das mach ich nämlich nicht, ich schraub mir den code mit notepad++ zusammen und benutz dann qmake / make in der konsole zum kompilieren.

    .pro file:

    TEMPLATE = app
    LANGUAGE = C++
    TARGET += 
    DEPENDPATH += .
    INCLUDEPATH += ./include
    
    # Input
    FORMS += \
    	ui/foobar.ui \
    
    HEADERS += \
    	include/foobar.h \
    
    SOURCES += \
    	src/foobar.cpp \
    	src/main.cpp \
    


  • Hallo,

    vielleicht kannst du dein letztes Posting, als verständliche Frage formuliert, nochmal posten?
    Ich sehe im Moment nicht, was du für ein Problem mit Qt hast?



  • also ich mache folgendes:

    designer anschmeissen, nen widget mit Objektname "Foobar" zusammenklicken und als foobar.ui speichern.

    dann passe ich meine foo.pro an (mit "qmake -project" erstellt).

    in foobar.h und foobar.cpp steck ich die implementation.

    foobar.h

    #include "ui_foobar.h"
    
    class Foobar : public QWidget, private Ui:Foobar
    {
     // konstruktor usw.
    }
    

    foobar.cpp

    #include "foobar.h"
    #include "ui_foobar.h" // dummy include, für qmake/make
    // impl
    

    main.cpp

    #include <application.h>
    #include "foobar.h"
    
    int main()
    {
    // qapp usw.
    Foobar *foo = new Foobar;
    // show etc.
    }
    

    in der foo.pro steht dann auszugsweise

    FORMS = \
     ui/foobar.ui \
    
    HEADERS = \
     include/foobar.h \
    
    SOURCES = \
     src/main.cpp \
     src/foobar.cpp \
    

    daraus erstell ich dann mittels "qmake" nen makefile.

    und laut qt4 doc erstellt er die "ui_*.h" files automatisch (uic), wenn diese header in einem der files includiert werden, die unter SOURCES angegeben sind.

    mein problem ist aber, dass er das eben nicht macht. nur dann, wenn der include im ersten file, das unter SOURCES angegeben ist, steht.
    in diesem fall also in "main.cpp"

    in dieser konstellation schmeisst er also beim compile nen fehler "ui_foobar.h" nicht gefunden.



  • also bei mir funkt es auch mit umgekehrter reihenfolge.

    welchen compiler verwendest du?
    versuch vielleicht einen target zu setzen (in der pro datei).



  • C:\>g++ --version
    g++ (GCC) 3.4.2 (mingw-special)
    Copyright (C) 2004 Free Software Foundation, Inc.
    This is free software; see the source for copying conditions.  There is NO
    warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
    

    hab jetzt einfach meinen scheduler an position eins der SOURCES gesetzt und da alle "ui_*.h" includes reingesetzt.

    nicht schön, aber funktioniert. vielleicht komm ich ja nochmal drauf, was da falsch ist 😉

    target ist übrigens gesetzt.



  • vielleicht weil ich den gcc 4.0 hab..
    aber keine ahnung..

    mfg aman..



  • Hallo,

    bei mir hat Qt mit dem Gcc3 und Gcc4 das gleiche Verhalten gezeigt.
    Poste mal deine qmake file, vielleicht hast du einen offensichtlichen Fehler eingebaut? Kannst du - ohne die ui_* Files an erster Stelle - dein Projekt compilen?



  • http://www.trolltech.com/developer/changes/changes-4.1.2.html
    -> "Fix compilation of .ui files with the QT_NO_CAST_FROM_ASCII define set."

    ^Ist das dein Problem vielleicht?



  • da steht nicht, was das problem damit war, ich vermute aber, dass es folgendes ist: wenn die option gesetzt ist, erstellt das pre-fix uic trotzdem noch implizite casts von const char* zu QString.

    vielleicht ist ja nen fehler in meinem pro-file:

    TEMPLATE = app
    TARGET = dynasty
    DEPENDPATH += .
    INCLUDEPATH += ./include
    RES_FILE += resource/Dynasty_private.res
    UI_HEADERS_DIR = ./include
    UI_SOURCES_DIR = ./src
    MOC_DIR = ./src
    OBJECTS_DIR = ./obj
    
    # Input
    FORMS += \
    	ui/dynasty.ui \
    	ui/mainscreen.ui \
    	ui/loadscreen.ui \
    
    HEADERS += \
    	include/scheduler.h \
    	include/dynasty.h \
    	include/mainscreen.h \
    	include/loadscreen.h \
    	include/mapgen.h \
    
    SOURCES += \
    	src/scheduler.cpp \
    	src/main.cpp \
    	src/dynasty.cpp \
    	src/mainscreen.cpp \
    	src/loadscreen.cpp \
    	src/mapgen.cpp \
    

Anmelden zum Antworten