Problem mit QtDesigner und ui_**.h
Problem mit QtDesigner und ui_**.h
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
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
-
- Beiträge: 7319
- Registriert: 26. August 2004 14:11
- Wohnort: Bremen
- Kontaktdaten:
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
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.
Code: Alles auswählen
class Ui_Transport;
class Transport ... {
...
Ui_Transport *mUi;
}
MfG Christian
'Funktioniert nicht' ist keine Fehlerbeschreibung
'Funktioniert nicht' ist keine Fehlerbeschreibung
Erstmal danke, aber irgendwie steh ich auf dem Schlauch.
Meine Dateien sehen so aus:
ui_Transport.h :
und die Transport.h
Im Konstruktor von Transport rufe ich dann auf.
Ich benutz es doch schon als Member in Transport.h, halt nicht als Pointer.
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 {};
}
Code: Alles auswählen
class Transport : public QWidget
{
/// public zeugs
private:
Ui::Transport m_ui;
};
Code: Alles auswählen
m_ui.setupUi(this);
Ich benutz es doch schon als Member in Transport.h, halt nicht als Pointer.
-
- Beiträge: 7319
- Registriert: 26. August 2004 14:11
- Wohnort: Bremen
- Kontaktdaten:
Dann geht überhaupt gar nichts mehr.
Ich muss ja dann im Konstruktor die Instanz auch mit new erzeugen.
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 ?
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);
"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 ?
-
- Beiträge: 7319
- Registriert: 26. August 2004 14:11
- Wohnort: Bremen
- Kontaktdaten:
-
- Beiträge: 7319
- Registriert: 26. August 2004 14:11
- Wohnort: Bremen
- Kontaktdaten:
-
- Beiträge: 7319
- Registriert: 26. August 2004 14:11
- Wohnort: Bremen
- Kontaktdaten:
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
'Funktioniert nicht' ist keine Fehlerbeschreibung
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
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
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.
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.