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 dem Aufgabenmenü von Qt Widgets Designer benutzerdefinierte Menüeinträge hinzufügen können.

Das Beispiel Task Menu Extension zeigt, wie diese Klasse verwendet werden kann.

QDesignerContainerExtension

QDesignerContainerExtension ist notwendig, wenn ein benutzerdefinierter mehrseitiger Container implementiert werden soll. 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 ihrer Implementierung nicht möglich, benutzerdefinierte Eigenschaften pro Seite 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.

Warnung: 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 Zeiger auf QObject nach unterstützten Schnittstellen zu suchen.

Exponieren einer Erweiterung gegenüber 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 Klasse QExtensionFactory unterordnen, 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 und ruft QExtensionFactory::createExtension() für jede von ihnen auf, 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 Qt Widgets Designer's Extension Manager

Wenn Sie ein benutzerdefiniertes Widget-Plugin implementieren, müssen Sie die Unterklasse QDesignerCustomWidgetInterface verwenden, um Ihr Plugin für Qt Widgets Designer zugänglich zu machen. Dies wird im Abschnitt Erstellen benutzerdefinierter 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 formEditor Parameter in der QDesignerCustomWidgetInterface::initialize() Funktion ist ein Zeiger auf Qt Widgets Designer's aktuelles QDesignerFormEditorInterface Objekt. Sie müssen die Funktion QDesignerFormEditorInterface::extensionManager() verwenden, um eine Schnittstelle zum Erweiterungsmanager von Qt Widgets Designer abzurufen. Dann verwenden Sie die Funktion QExtensionManager::registerExtensions(), um Ihre eigene Erweiterungsfabrik zu registrieren.

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.