Locked History Attachments

PortingMitkQt4UiFiles

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

  1. Kopiert die Dateien MyWidgetControls.ui und MyWidget.h/.cpp in euren Qt4-Ordner

  2. MyWidgetControls.ui mit dem Qt4-Designer öffnen

  3. 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

  4. Überprüft, ob alles an der richtigen Stelle ist. Gerade Icons werden nicht mit übernommen. Diese müsst ihr neu einfügen

  5. 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

  6. Löscht jegliche Connections zu Slots, die in MyWidgetControls.ui.h untergebracht waren

  7. Öffnet MyWidget.h und ändert alles, was mit unseren "MyWidgetControls zu tun hat entsprechend ab

   1 // Include ändern
   2 #include "ui_MyWidgetControls.h"
   3 //#include "MyWidgetControls.h"
   4 
   5 ...
   6 // Pointer ändern
   7 protected:
   8   Ui::MyWidgetControls* m_Controls;
   9   //MyWidgetControls* m_Controls;
  10 
  1. 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:

   1 //@file MyWidgetControls.ui.h
   2 ...
   3 
   4 void my_button_clicked()
   5 {
   6   cout << "my button was clicked" << endl;
   7 } 
  • Diesen Slot übernehmen wir nun in unsere MyWidget-Klasse:

   1 //@file MyWidget.h
   2 ...
   3 public slots:
   4   void my_button_clicked(); 

   1 //@file MyWidget.cpp
   2 ...
   3 
   4 void my_button_clicked()
   5 {
   6   cout << "my button was clicked" << endl;
   7 } 
  1. 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 } 
  1. 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...