Erstellen von benutzerdefinierten Widget-Erweiterungen
Sobald Sie ein benutzerdefiniertes Widget-Plugin für Qt Widgets Designer erstellt haben, können Sie ihm mit Hilfe von benutzerdefinierten Widget-Erweiterungen das erwartete Verhalten und die Funktionalität im Arbeitsbereich von Qt Widgets Designer verleihen.
Erweiterungstypen
Es gibt verschiedene Arten von Erweiterungen in Qt Widgets Designer. Sie können alle diese Erweiterungen nach dem gleichen Muster verwenden, indem Sie nur die jeweilige Erweiterungs-Basisklasse ersetzen.
QDesignerContainerExtension ist notwendig, wenn ein benutzerdefinierter mehrseitiger Container implementiert wird.
![]() | QDesignerTaskMenuExtension QDesignerTaskMenuExtension ist nützlich für benutzerdefinierte Widgets. Sie bietet eine Erweiterung, mit der Sie benutzerdefinierte Menüeinträge zum Aufgabenmenü von Qt Widgets Designer hinzufügen können. Das Beispiel Aufgabenmenü-Erweiterung veranschaulicht, wie diese Klasse verwendet werden kann. |
![]() | QDesignerContainerExtension QDesignerContainerExtension ist notwendig, wenn ein benutzerdefinierter mehrseitiger Container implementiert wird. Sie bietet eine Erweiterung, mit der Sie Seiten für ein mehrseitiges Container-Plugin in Qt Widgets Designer hinzufügen und löschen können. Das Beispiel Container Extension erläutert die Verwendung dieser Klasse. Hinweis: Für einige Widgets (z. B. QTabWidget) ist es aufgrund der Art und Weise, wie sie implementiert sind, nicht möglich, benutzerdefinierte seitenbezogene Eigenschaften hinzuzufügen. |
![]() | QDesignerMemberSheetExtension Die Klasse QDesignerMemberSheetExtension ermöglicht es Ihnen, die Mitgliedsfunktionen eines Widgets zu manipulieren, die beim Verbinden von Signalen und Slots angezeigt werden. |
![]() | QDesignerPropertySheetExtension, QDesignerDynamicPropertySheetExtension Mit diesen Erweiterungsklassen können Sie steuern, wie die Eigenschaften eines Widgets im Eigenschaftseditor von Qt Widgets Designer angezeigt werden. |
Qt Widgets Designer verwendet die Klassen QDesignerPropertySheetExtension und QDesignerMemberSheetExtension, um seine Eigenschafts-, Signal- und Slot-Editoren zu speisen. Wann immer ein Widget in seinem Arbeitsbereich ausgewählt wird, fragt Qt Widgets Designer nach der Eigenschaftsblatt-Erweiterung des Widgets; ebenso fragt Qt Widgets Designer nach den Mitgliedblatt-Erweiterungen der Widgets, wenn eine Verbindung zwischen zwei Widgets angefordert wird.
Achtung! Alle Widgets haben standardmäßige Eigenschafts- und Mitgliederblätter. Wenn Sie benutzerdefinierte Eigenschaftsblatt- oder Mitgliederblatt-Erweiterungen implementieren, setzen Ihre benutzerdefinierten Erweiterungen die Standardblätter außer Kraft.
Erstellen einer Erweiterung
Um eine Erweiterung zu erstellen, müssen Sie sowohl QObject als auch die entsprechende Basisklasse erben und deren Funktionen reimplementieren. Da wir eine Schnittstelle implementieren, müssen wir sicherstellen, dass sie dem Meta-Objektsystem mit dem Makro Q_INTERFACES() in der Definition der Erweiterungsklasse bekannt gemacht wird. Ein Beispiel:
class MyExtension: public QObject, public QdesignerContainerExtension { Q_OBJECT Q_INTERFACE(QDesignerContainerExtension) ... }
So kann Qt Widgets Designer die Funktion qobject_cast() verwenden, um nur mit einem QObject -Zeiger nach unterstützten Schnittstellen zu suchen.
Offenlegen einer Erweiterung für Qt Widgets Designer
In Qt Widgets Designer werden die Erweiterungen erst erstellt, wenn sie benötigt werden. Aus diesem Grund müssen Sie bei der Implementierung von Erweiterungen die Subklasse QExtensionFactory verwenden, um eine Klasse zu erstellen, die in der Lage ist, Instanzen Ihrer Erweiterungen zu erzeugen. Außerdem müssen Sie Ihre Fabrik beim Erweiterungsmanager von Qt Widgets Designer registrieren; der Erweiterungsmanager kümmert sich um die Erstellung von Erweiterungen.
Wenn eine Erweiterung angefordert wird, durchläuft der Erweiterungsmanager von Qt Widgets Designer seine registrierten Fabriken, indem er QExtensionFactory::createExtension() für jede von ihnen aufruft, bis er eine findet, die in der Lage ist, die angeforderte Erweiterung für das ausgewählte Widget zu erstellen. Diese Fabrik wird dann eine Instanz der Erweiterung erstellen.
Erstellen einer Erweiterungsfabrik
Die Klasse QExtensionFactory bietet eine Standard-Erweiterungsfabrik, kann aber auch als Schnittstelle für eigene Erweiterungsfabriken verwendet werden.
Der Zweck besteht darin, die Funktion QExtensionFactory::createExtension() neu zu implementieren, so dass sie in der Lage ist, Ihre Erweiterung zu erstellen, wie z. B. eine MultiPageWidget-Container-Erweiterung.
Sie können entweder eine neue QExtensionFactory erstellen und die Funktion QExtensionFactory::createExtension() neu implementieren:
QObject *ANewExtensionFactory::createExtension(QObject *object, const QString &iid, QObject *parent) const { if (iid != Q_TYPEID(QDesignerContainerExtension)) return 0; if (MyCustomWidget *widget = qobject_cast<MyCustomWidget*> (object)) return new MyContainerExtension(widget, parent); return 0; }
oder Sie können eine bestehende Fabrik verwenden und die Funktion QExtensionFactory::createExtension() erweitern, damit die Fabrik auch Ihre benutzerdefinierte Erweiterung erstellen kann:
QObject *AGeneralExtensionFactory::createExtension(QObject *object, const QString &iid, QObject *parent) const { MyCustomWidget *widget = qobject_cast<MyCustomWidget*>(object); if (widget && (iid == Q_TYPEID(QDesignerTaskMenuExtension))) { return new MyTaskMenuExtension(widget, parent); } else if (widget && (iid == Q_TYPEID(QDesignerContainerExtension))) { return new MyContainerExtension(widget, parent); } else { return 0; } }
Zugriff auf den Erweiterungsmanager von Qt Widgets Designer
Wenn Sie ein benutzerdefiniertes Widget-Plugin implementieren, müssen Sie die Unterklasse QDesignerCustomWidgetInterface verwenden, um Ihr Plugin dem Qt Widgets Designer zur Verfügung zu stellen. Dies wird im Abschnitt Erstellen von benutzerdefinierten Widgets für Qt Widgets Designer ausführlicher behandelt. Die Registrierung einer Erweiterungsfabrik wird normalerweise in der Funktion QDesignerCustomWidgetInterface::initialize() vorgenommen:
void MyPlugin::initialize(QDesignerFormEditorInterface *formEditor) { if (initialized) return; QExtensionManager *manager = formEditor->extensionManager(); Q_ASSERT(manager != 0); manager->registerExtensions(new MyExtensionFactory(manager), Q_TYPEID(QDesignerTaskMenuExtension)); initialized = true; }
Der Parameter formEditor
in der Funktion QDesignerCustomWidgetInterface::initialize() ist ein Zeiger auf das aktuelle QDesignerFormEditorInterface Objekt von Qt Widgets Designer. Sie müssen die Funktion QDesignerFormEditorInterface::extensionManager() verwenden, um eine Schnittstelle zu Qt Widgets Designers Erweiterungsmanager abzurufen. Dann verwenden Sie die Funktion QExtensionManager::registerExtensions(), um Ihre eigene Erweiterungsfabrik zu registrieren.
Verwandte Beispiele
Weitere Informationen zum Erstellen von benutzerdefinierten Widget-Erweiterungen in Qt Widgets Designer finden Sie in den Beispielen Taskmenü-Erweiterung und Container-Erweiterung.
© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.