Problem mit QtDesigner und ui_**.h

Alles rund um die Programmierung mit Qt
Antworten
skeemo
Beiträge: 39
Registriert: 8. Oktober 2010 09:39

Problem mit QtDesigner und ui_**.h

Beitrag von skeemo »

Hallo,

ich habe ein komisches Problem, welches ich nicht ganz verstehe, und mich gerade mittelschwer in den Wahnsinn treibt ....

Ok, ich habe ein Widget bestehend aus ein paar Pushbuttons in einem seperaten Projekt mit dem QtDesigner erstellt. Es heisst Transport.
Es besteht also aus Transport.ui, Transport.h, Transport.cpp und nach dem Builden noch aus ui_Transport.h. In meinem (Test-)Projekt passt dann auch alles was diese Dateistruktur angeht.

So, nun wirds komplizierter.
Das Widget sollte nun in ein grosses Ganzes, also eine Anwendung, integriert werden. Die vorher getesteten Widgets wie z.b. das Transport Widget wollte ich einfach ohne die .pro aus dem Testprojekt nur mit den o.g. Quellcode Dateien benutzen, also die Dateien einfach ins neue Projekt kopieren.

Da ich Wert auf Übersicht lege, baue ich mir eine Ordnerstruktur auf und teile Klassen so in "Packages" auf.

Meine Transport-Widget Quellcode Dateien landen bei mir in folgendem Ordner :

/ui/widgets/Transport

In meinem Mainwindow inkludiere ich dann einfach "ui/widgets/Transport/Tansport.h" und ich kann mein Widget verwenden. Passt.

Mir ist nun aber direkt beim BuildProzess der Anwendung aufgefallen, dass er für meine Widgets die ui_Transport.h nicht in meinem Packageordner erzeugt sondern im Rootverzeichnis der Applikation, also da wo die main.cpp ist.

Nun musste ich im Laufe der weiteren Entwicklung eine Änderung im TransportWidget vornehmen (Button Reihenfolge). Ich öffne also die .ui und nehme die Änderungen vor.

Nun ergibt sich das Problem (sorry für die lange Einleitung):

Da ich in meiner Transport.h natürlich die im package-pfad liegende ui_Transport.h inkludiere und nicht die aus dem root verzeichnis, wird eine alte ui_transport.h benutzt und die Änderungen sind nicht da.

In der root ui_transport.h sind die Änderungen natürlich drin.

Ich habe ungern die ui_*.h zu meinen ganzen widgets im root ordner rumfliegen...

Wie bekomm ich nun Qt oder QtCreator dazu, die ui_*.h für meinen Widgets nun im richtigen Ordner zu erzeugen ??

Danke für jegliche Hilfe,

Chris
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Gar nicht. Ist auch nicht wirklich nötig wenn man nicht vom UI ableitet sondern es als Member benutzt. Dann einfach eine Vorwärtsdeklaration im Header und den ui-Member als Pointer

Code: Alles auswählen

class Ui_Transport;

class Transport ... {
...
  Ui_Transport *mUi;
}
Alles andere bringt Dich nur früher oder später wieder zu deinem ursprünglichen Problem. Vor allem wenn man Dialoge in eine Lib packt und diese woanders benutzen will. Da muss nämlich sonst immer der generierte Code aus der ui-Datei mitgeliefert werden was nicht Sinn der Sache ist.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
skeemo
Beiträge: 39
Registriert: 8. Oktober 2010 09:39

Beitrag von skeemo »

Erstmal danke, aber irgendwie steh ich auf dem Schlauch.

Meine Dateien sehen so aus:

ui_Transport.h :

Code: Alles auswählen

class Ui_Transport
{
public:
     /// ... setupUi() und Member
};

namespace Ui {
    class Transport: public Ui_Transport {};
}
und die Transport.h

Code: Alles auswählen

class Transport : public QWidget
{
      /// public zeugs
private:
      Ui::Transport       m_ui;
};
Im Konstruktor von Transport rufe ich dann

Code: Alles auswählen

m_ui.setupUi(this);
auf.

Ich benutz es doch schon als Member in Transport.h, halt nicht als Pointer.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Wenn man es nicht als Pointer benutzt geht auch keine Vorwärtsdeklaration und man muss die generierte ui_.h - Datei im Header inkludieren... Mache es so wie ich es gesagt habe und es geht ohne include.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
skeemo
Beiträge: 39
Registriert: 8. Oktober 2010 09:39

Beitrag von skeemo »

Dann geht überhaupt gar nichts mehr.

Ich muss ja dann im Konstruktor die Instanz auch mit new erzeugen.

Code: Alles auswählen

m_ui = new Ui_Transport();
m_ui->setupUi(this);
Dann gibts nämlich
"invalid use of incomplete type 'struct Ui_Transport'
forward declaration of 'struct Ui_Transport'"
für jeden verweis auf m_ui.


Ausserdem, wird dann nicht trotzdessen der ui_.h Header im root ordner erzeugt ?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Den generierten Header muss man schon inkludieren - aber eben nur in der cpp-Datei...
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
skeemo
Beiträge: 39
Registriert: 8. Oktober 2010 09:39

Beitrag von skeemo »

Argh, ja klar, stimmt..

Das ändert dann aber nix an der Tatsache, dass der generierte Header trotzdem nicht in meinem Package Ordner landet, sondern im Hauptverzeichnis rumgurkt.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Und was stört Dich daran? Mach ein Out-Of-Source build (bzw. Shadow-Build) und schon sind alle generierten Dateien in einem separaten Verzeichnis und das Source-Dir wird nicht verschmutzt.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
skeemo
Beiträge: 39
Registriert: 8. Oktober 2010 09:39

Beitrag von skeemo »

Hm....

Bin ich halt nicht so gewohnt ;)

Das mit dem Shadow-Build wäre schon ne gute Lösung.

Wahrscheinlich mach ichs einfach so.

Dann geb ich beim inkludieren in der cpp einfach gar keinen Pfad mehr an oder wie ?
Nur #include "ui_Transport.h" ?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Ja, das geht. Das Problem ist das man qmake zwar sagen kann wo er die genierten Dateien hinlegen kann - aber eben nur global und nicht pro Datei. Das geht dann nur wenn es einzelne pro-Dateien sind und man mit 'subdirs' arbeitet. Dann müssen es m.E. aber auch einzelne Libraries werden.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
skeemo
Beiträge: 39
Registriert: 8. Oktober 2010 09:39

Beitrag von skeemo »

Jo, aber weisste was ? Mir gefällt die ShadowBuild Lösung jetzt sogar echt besser.

Alleine auch deswegen schon weil nicht ständig die makefiles und die Debug / Release Ordner im Sourcen Verzeichnis rumfliegen. Das hatte ich gar nicht bedacht, dass sich das ja dann auch verabschieden wird :)

Und das ist hinsichtlich meiner versionierung mit tortoise auch etwas übersichtlicher :)

Danke für die Hilfe, hat mich ein Stück weitergebracht :D :D
skeemo
Beiträge: 39
Registriert: 8. Oktober 2010 09:39

Beitrag von skeemo »

Jetzt versteh ich gar nix mehr.

Gestern lief alles, heute habe ich in ganz andere Programmteile weitergearbeitet. An den Widgets aber nichts verändert.

Nun bekomme ich beim Buildprozess folgende Fehlermeldung:

No rule to make target '../ui/widgets/Transport/ui_Transport.h' needed by 'debug/Transport.o'


Also erstens liegt die ui_transport.h schon in meinem shadowbuild ordner, und müsste aufgrund der nicht vorhandenen änderungen auch nicht neu erstellt werden.
Zweitens habe ich nirgendwo mehr verweise auf den alten Pfad mit dem Header.

Ratlos again.
Antworten