Auf dieser Seite

Erstellen benutzerdefinierter Widget-Erweiterungen

Sobald Sie über ein benutzerdefiniertes Widget-Plugin für den „ Qt Widgets “-Designer verfügen, können Sie diesem mithilfe benutzerdefinierter Widget-Erweiterungen das erwartete Verhalten und die gewünschten Funktionen innerhalb des Arbeitsbereichs des „ Qt Widgets “-Designers zuweisen.

Erweiterungstypen

Im „ Qt Widgets “-Designer stehen mehrere Arten von Erweiterungen zur Verfügung. Sie können alle diese Erweiterungen nach dem gleichen Muster verwenden, wobei lediglich die jeweilige Basisklasse der Erweiterung ersetzt wird.

QDesignerContainerExtension ist bei der Implementierung eines benutzerdefinierten mehrseitigen Containers erforderlich.

Screenshot der Arbeitsfläche des Designer-Editors, auf dem ein einfaches benutzerdefiniertes Widget mit geöffnetem Kontextmenü zu sehen ist, wobei die Option „Status bearbeiten“ hervorgehoben istQDesignerTaskMenuExtension

QDesignerTaskMenuExtension ist nützlich für benutzerdefinierte Widgets. Es stellt eine Erweiterung bereit, mit der Sie dem Aufgabenmenü des „ Qt Widgets “-Designers benutzerdefinierte Menüeinträge hinzufügen können.

Das Beispiel „Task-Menü-Erweiterung“ veranschaulicht die Verwendung dieser Klasse.

Screenshot des Designer-Editors, der einen Container und ein geöffnetes Kontextmenü zeigtQDesignerContainerExtension

QDesignerContainerExtension ist bei der Implementierung eines benutzerdefinierten mehrseitigen Containers erforderlich. Es stellt eine Erweiterung bereit, mit der Sie im „ Qt Widgets -Designer“ Seiten für ein Plugin eines mehrseitigen Containers hinzufügen und löschen können.

Das Beispiel „Container-Erweiterung“ erläutert die Verwendung dieser Klasse näher.

Hinweis: Bei einigen Widgets (z. B. „ QTabWidget “) istes aufgrund ihrer Implementierung nicht möglich, benutzerdefinierte Eigenschaften auf Seitenebene hinzuzufügen.

Screenshot von „Verbindung konfigurieren“, der zeigt, welche Funktionen die verbundenen Widgets untereinander austauschen sollenQDesignerMemberSheetExtension

Die Klasse „ QDesignerMemberSheetExtension “ ermöglicht es Ihnen, die Mitgliedsfunktionen eines Widgets zu bearbeiten, die beim Verbinden von Signalen und Slots angezeigt werden.

Screenshot des „Eigenschaften-Editors“ mit den Eigenschaften und Einstellungen eines ObjektsQDesignerPropertySheetExtension, QDesignerDynamicPropertySheetExtension

Mit diesen Erweiterungsklassen können Sie steuern, wie die Eigenschaften eines Widgets im Eigenschaftseditor des Qt Widgets Designers angezeigt werden.

Qt Widgets Der Designer nutzt die Klassen „ QDesignerPropertySheetExtension “ und „ QDesignerMemberSheetExtension “, um seine Eigenschafts- sowie Signal- und Slot-Editoren zu versorgen. Immer wenn ein Widget im Arbeitsbereich ausgewählt wird, fragt der „ Qt Widgets Designer“ nach der Erweiterung für das Eigenschaftsblatt des Widgets ab; ebenso fragt der „ Qt Widgets Designer“ bei jeder angeforderten Verbindung zwischen zwei Widgets nach den Erweiterungen für die Member-Blätter der Widgets ab.

Warnung: Alle Widgets verfügen über Standard-Eigenschafts- und Mitgliedsblätter. Wenn Sie benutzerdefinierte Erweiterungen für Eigenschafts- oder Mitgliedsblätter implementieren, überschreiben Ihre benutzerdefinierten Erweiterungen die Standardblätter.

Erstellen einer Erweiterung

Um eine Erweiterung zu erstellen, müssen Sie sowohl von „ QObject “ als auch von der entsprechenden Basisklasse erben und deren Funktionen neu implementieren. Da wir eine Schnittstelle implementieren, müssen wir sicherstellen, dass diese dem Metaobjektsystem mithilfe des Makros „ Q_INTERFACES()“ in der Definition der Erweiterungsklasse bekannt gemacht wird. Beispiel:

class MyExtension: public QObject,
                   public QDesignerContainerExtension
{
    Q_OBJECT
    Q_INTERFACE(QDesignerContainerExtension)

    ...
}

Dadurch kann der „ Qt Widgets Designer“ die Funktion „ qobject_cast()“ nutzen, um ausschließlich mithilfe eines „ QObject “-Zeigers nach unterstützten Schnittstellen abzufragen.

Eine Erweiterung für den „ Qt Widgets Designer“ verfügbar machen

Im „ Qt Widgets Designer“ werden die Erweiterungen erst dann erstellt, wenn sie benötigt werden. Aus diesem Grund müssen Sie bei der Implementierung von Erweiterungen eine Unterklasse von ` QExtensionFactory ` erstellen, um eine Klasse zu definieren, die Instanzen Ihrer Erweiterungen erstellen kann. Außerdem müssen Sie Ihre Factory beim Erweiterungsmanager des „ Qt Widgets Designers“ registrieren; der Erweiterungsmanager übernimmt die Erstellung der Erweiterungen.

Wenn eine Erweiterung angefordert wird, durchläuft der Erweiterungsmanager des „ Qt Widgets “-Designers die registrierten Fabriken und ruft für jede von ihnen ` QExtensionFactory::createExtension()` auf, bis er eine findet, die in der Lage ist, die angeforderte Erweiterung für das ausgewählte Widget zu erstellen. Diese Fabrik erstellt dann eine Instanz der Erweiterung.

Diagramm zur Darstellung der Beziehungen zwischen den Komponenten des Qt Widgets Designers

Erstellen einer Erweiterungsfabrik

Die Klasse ` QExtensionFactory ` stellt eine Standard-Erweiterungsfabrik bereit, kann aber auch als Schnittstelle für benutzerdefinierte Erweiterungsfabriken verwendet werden.

Der Zweck besteht darin, die Funktion ` QExtensionFactory::createExtension()` neu zu implementieren, damit sie Ihre Erweiterung erstellen kann, beispielsweise eine Container-Erweiterung für das ` MultiPageWidget `.

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 vorhandene Factory verwenden und die Funktion ` QExtensionFactory::createExtension()` erweitern, damit die Factory 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 des „ Qt Widgets Designer“

Bei der Implementierung eines benutzerdefinierten Widget-Plugins müssen Sie eine Unterklasse von ` QDesignerCustomWidgetInterface ` erstellen, um Ihr Plugin für den „ Qt Widgets Designer“ verfügbar zu machen. Dies wird im Abschnitt „Erstellen benutzerdefinierter Widgets für den „ Qt Widgets Designer“ “ ausführlicher behandelt. Die Registrierung einer Erweiterungs-Factory erfolgt in der Regel in der Funktion ` QDesignerCustomWidgetInterface::initialize()`:

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 des „ Qt Widgets Designer“. Sie müssen die Funktion „ QDesignerFormEditorInterface::extensionManager()“ verwenden, um eine Schnittstelle zum Erweiterungsmanager des „ Qt Widgets Designer“ abzurufen. Anschließend registrieren Sie Ihre benutzerdefinierte Erweiterungsfabrik mit der Funktion „ QExtensionManager::registerExtensions()“.

Weitere Informationen zum Erstellen benutzerdefinierter Widget-Erweiterungen im „ Qt Widgets “-Designer finden Sie in den Beispielen „Task Menu Extension “ und „Container Extension “.

© 2026 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.