Portierung von .ui-Dateien nach Qt4
Offizielle Seite: "Porting .ui Files to Qt 4"
Der Hauptunterschied des Qt4-Designers zum Qt3-Designer sind der fehlende Projekt-Manager und Code-Editor. Trolltech will in Zukunft verhindern, dass die Programmierarbeit bereits in der Designer-Umgebung vorgenommen wird. Aus den .ui-Dateien des Qt4-Designers wird eine leblose Klasse generiert, die keinen eigenen Programmcode enthält und nur die einzelnen Widgets zusammenbaut. Die Ausimplementierung von Slots erfolgt dann in der Entwicklungsumgebung.
In Qt3 bestand eine GUI-Klasse, die man mit Unterstüzung des Designers erstellen wollte aus folgenden Dateien:
MyWidgetControls.ui
MyWidgetControls.ui.h
MyWidget.h/.cpp
Aus der Datei MyWidgetControls.ui generierte der ui-Compiler zusätzlich die Dateien MyWidgetControls.h/.cxx, die die Klasse MyWidgetControls definiert, welche von QWidget erbt. MyWidgetControls.ui.h enthielt im Designer ausimplementierte Slots dieser Klasse. In MyWidget.h/.cpp legte man anschließend eine Instanz dieser Klasse an und fügte weitere Programmlogik hinzu.
In Qt4 hingegen besteht eine GUI-Klasse nur noch aus folgenden Dateien:
MyWidgetControls.ui
MyWidget.h/.cpp
Der ui-Compiler erzeugt aus MyWidgetControls.ui die Datei ui_MyWidgetControls.h. Diese Header-Datei enthält die Klasse Ui::MyWidgetControls. Diese Klasse ist nicht von QWidget abgeleitet und enthält keine eigene Programmlogik. Stattdessen enthält sie nur noch Pointer auf die im Designer erstellten Widgets, wie Buttons, Listen-Views, etc.
=> Jegliche eigene Programmlogik wird in der Klasse MyWidget untergebracht.
Schritt-für-Schritt-Anleitung zur Portierung eurer .ui-Dateien nach Qt4
Kopiert die Dateien MyWidgetControls.ui und MyWidget.h/.cpp in euren Qt4-Ordner
MyWidgetControls.ui mit dem Qt4-Designer öffnen
Der Designer erkennt, dass die Datei mit dem Qt3-Designer erstellt wurde und schlägt vor diese zu konvertieren. Dieses Angebot nehmt ihr dankend an
Überprüft, ob alles an der richtigen Stelle ist. Gerade Icons werden nicht mit übernommen. Diese müsst ihr neu einfügen
Nehmt ggfs. Änderungen am Formular vor: Beim Konvertieren werden Qt3-Klassen, die es nicht mehr gibt in Qt4 durch Qt3-Support-Klassen ersetzt, was grundsätzlich OK ist, allerdings wäre jetzt eine gute Möglichkeit die GUI vollständig nach Qt4 zu portieren und auf diese Support-Klassen zu verzichten
Löscht jegliche Connections zu Slots, die in MyWidgetControls.ui.h untergebracht waren
Öffnet MyWidget.h und ändert alles, was mit unseren "MyWidgetControls zu tun hat entsprechend ab
Zusätzlich übernehmen wir alle Slots aus MyWidgetControls.ui.h in diese Klasse. Angenommen dort wäre ein Slot "my_button_clicked" folgendermaßen definiert gewesen:
Diesen Slot übernehmen wir nun in unsere MyWidget-Klasse:
Jetzt müssen wir noch die Ui-Klasse in MyWidget.cpp mit der Methode setupUi() an geeigneter Stelle korrekt initialisieren:
1 //@file MyWidget.cpp
2 ...
3
4 void MyWidget::CreateQtPartControl(QWidget *parent)
5 {
6 // Setup Routine für Klasse Ui::MyWidgetControls anstelle von Instanziierung
7 m_Controls = new Ui::MyWidgetControls;
8 m_Controls->setupUi(parent);
9 // m_Controls = new MyWidgetControls(parent);
10
11 ...
12 }
- Anschließend müssen wir jetzt noch unsere Slot(s) korrekt verbinden. In unserem Fall also den Slot my_button_clicked() mit dem entsprechenden Button
1 //@file MyWidget.cpp
2 ...
3
4 void MyWidget::CreateQtPartControl(QWidget *parent)
5 {
6 // Setup Routine für Klasse Ui::MyWidgetControls anstelle von Instanziierung
7 m_Controls = new Ui::MyWidgetControls;
8 m_Controls->setupUi(parent);
9 // m_Controls = new MyWidgetControls(parent);
10
11 // Connections erstellen
12 QObject::connect( m_Controls->my_button, SIGNAL(clicked()), this, SLOT(my_button_clicked()) );
13 ...
14 }
=> Fertig. Hoffentlich gehts...
