Locked History Attachments

PortingMitkQt4

Portierung MITK/Qt3.3 -> BlueBerry/Qt4

Dieser Artikel beschäftigt sich mit der Portierung von Qt3-Functionalities in die neue Plattform BlueBerry, die auf Qt4 aufsetzt. Wie der Titel ja schon sagt gibt es zwei Dinge, die man bei der Portierung getrennt beachten muss: Auf der einen Seite ist die Umstellung auf Qt4, die von Trolltech weitgehend gut dokumentiert ist. Auf der anderen Seite steht die Umstellung auf die neue Plattform-Architektur BlueBerry. Während es bei der Qt-Umstellung meistens nur darum geht eine gleichwertige GUI für seine Functionality in Qt4 zu erstellen, muss man sich bei der Umstellung auf die neue Plattform aufgrund der Änderungen evtl. weitere Gedanken machen. (Hoffentlich) alles zur Umstellung auf die neue Plattform werde ich im ersten Teil abhandeln, im zweiten Teil gehe ich auf die für uns wichtigen Teile der Qt4-Umstellung ein.

Functionality vs. BlueBerry Bundle

Die BlueBerry-Workbench

Portierung nach Qt4

Offizielle Qt-Seite: "Moving from Qt 3 to Qt 4" bzw. "Porting to Qt 4"

Um zu starten, hier eine kurze Liste von Änderungen, die für MITK-Entwickler interessant sein dürften:

  1. Andere Benennung von Methoden (bzw. allg. Symbolen)
  2. Die Erstellung von Menüs und Menüelementen wurde komplett überarbeitet
  3. Qt4 führt komplett generische Listen ein, die keinen Unterschied mehr machen zwischen Pointern- und Werte-Elementen. D.h. anstelle von "QPtrList" und "QValueList" gibts jetzt nur noch "QList"
  4. Oft und gerne benutzt in Qt3: Klassen, die ein Layout implizieren- "QHBox", "QVBox", "QButtonGroup". Entweder gibts diese nicht mehr oder sie stellen kein Layout ("QButtonGroup") mehr bereit
  5. Qt Designer: Im Qt3-Designer war es möglich eine Menge von Programmierarbeit und Projektmanagement in der Designerumgebung vorzunehmen. Da Trolltech der Meinung war, dass diese Aufgaben in eine IDE wie Visual Studio gehören, wurde der neue Designer um diese Features beschnitten. Damit ändert sich viel im Umgang mit den .ui-Dateien, wie sie auch im MITK häufiger verwendet werden

Andere Benennung von Methoden

Oftmals haben sich nur Benennungen von Methoden geändert. In diesem Fall ist es das Beste die Qt 4-Dokumentation zur Hand zu nehmen und die entsprechende Klasse anzuklicken. Dort findet sich jeweils unterhalb der Kurzbeschreibung ein Link "Qt 3 support members". Hier sind alle veralteten Methoden aus Qt 3 einzusehen. Glücklicherweise gibt es bei allen diesen Methoden ein Hinweis, wie die entsprechende Methode in Qt 4 heißt. Nach dem Umbenennen dürften die Fehler beseitigt sein.

Menüs und Menüelemente

Die zwei getrennten Klassen "QMenuItem" und "QAction" sind zu einer "QAction"-Klasse zusammengefasst worden. Im Großen und Ganzen heißt das, dass die Klasse QMenu keine komplette QMenuItem-API bereitstellt, sondern nur Methoden um QAction`s hinzuzufügen oder herauszunehmen. Man arbeitet also nicht mehr mit Indizes, um auf Menüelemente zuzugreifen und Eigenschaften zu verändern, sondern man speichert direkt Pointer auf QAction-Instanzen ab und greift dort ggfs. auf Methoden zu. Beispiel:

Qt3

Qt4

m_NameMenuAction = m_PopupMenu->insertItem("Name...");
mitk::StringProperty* nameProperty = dynamic_cast<mitk::StringProperty*>( m_PropertyList->GetProperty("name"));
m_PopupMenu->setItemEnabled( m_NameMenuAction, nameProperty != NULL );
if (nameProperty) { m_PopupMenu->connectItem( m_NameMenuAction, this, SLOT(onNameClicked()) );
}

m_NameMenuAction = new QAction(QString("Name..."), this); m_PopupMenu->addAction(m_NameMenuAction);
mitk::StringProperty* nameProperty = dynamic_cast<mitk::StringProperty*>( m_PropertyList->GetProperty("name"));
m_NameMenuAction->setEnabled(nameProperty != NULL);
if (nameProperty) { connect( m_NameMenuAction, SIGNAL(triggered()), this, SLOT(onNameClicked()) );
}

Layouts

Portierung von .ui-Dateien nach Qt4

Siehe auch dazu die offizielle Qt-Seite: Porting .ui Files to Qt4