Sur cette page

Création d'extensions de widgets personnalisés

Une fois que vous avez créé un plugin de widget personnalisé pour Qt Widgets Designer, vous pouvez lui donner le comportement et les fonctionnalités attendus dans l'espace de travail de Qt Widgets Designer, en utilisant des extensions de widget personnalisées.

Types d'extensions

Il existe plusieurs types d'extensions dans Qt Widgets Designer. Vous pouvez utiliser toutes ces extensions selon le même modèle, en remplaçant uniquement la classe de base de l'extension concernée.

QDesignerContainerExtension est nécessaire lors de la mise en œuvre d'un conteneur multipage personnalisé.

Capture d'écran de l'éditeur de conception montrant un simple widget personnalisé avec un menu contextuel ouvert, mettant en évidence l'option "Editer l'état".QDesignerTaskMenuExtension

QDesignerTaskMenuExtension est utile pour les widgets personnalisés. Il s'agit d'une extension qui vous permet d'ajouter des entrées de menu personnalisées au menu des tâches de Qt Widgets Designer.

L'exemple de l'extension du menu des tâches illustre l'utilisation de cette classe.

Capture d'écran de l'éditeur de conception montrant un conteneur et un menu contextuel ouvertQDesignerContainerExtension

QDesignerContainerExtension est nécessaire lors de l'implémentation d'un conteneur multi-pages personnalisé. Elle fournit une extension qui vous permet d'ajouter et de supprimer des pages pour un plugin de conteneur multipage dans Qt Widgets Designer.

L'exemple Container Extension explique plus en détail comment utiliser cette classe.

Remarque : il n'est pas possible d'ajouter des propriétés personnalisées par page pour certains widgets (par exemple, QTabWidget) en raison de la manière dont ils sont implémentés.

Capture d'écran de "Configurer la connexion" montrant les fonctions que les widgets connectés doivent s'envoyer mutuellement.QDesignerMemberSheetExtension

La classe QDesignerMemberSheetExtension vous permet de manipuler les fonctions membres d'un widget affichées lors de la connexion de signaux et d'emplacements.

Capture d'écran de l'"Éditeur de propriétés" montrant les propriétés et les paramètres utilisés pour un objetQDesignerPropertySheetExtension, QDesignerDynamicPropertySheetExtension

Ces classes d'extension vous permettent de contrôler la manière dont les propriétés d'un widget sont affichées dans l'éditeur de propriétés de Qt Widgets Designer.

Qt Widgets Designer utilise les classes QDesignerPropertySheetExtension et QDesignerMemberSheetExtension pour alimenter ses éditeurs de propriétés, de signaux et de slots. Chaque fois qu'un widget est sélectionné dans son espace de travail, Qt Widgets Designer demande l'extension de la feuille de propriétés du widget ; de même, chaque fois qu'une connexion entre deux widgets est demandée, Qt Widgets Designer demande les extensions de la feuille de membres des widgets.

Attention : Tous les widgets ont des feuilles de propriétés et de membres par défaut. Si vous implémentez des extensions de feuilles de propriétés ou de feuilles de membres personnalisées, vos extensions personnalisées remplaceront les feuilles par défaut.

Création d'une extension

Pour créer une extension, vous devez hériter de QObject et de la classe de base appropriée, et réimplémenter ses fonctions. Comme nous implémentons une interface, nous devons nous assurer qu'elle est connue du système de métaobjets à l'aide de la macro Q_INTERFACES() dans la définition de la classe d'extension. En voici un exemple :

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

    ...
}

Cela permet à Qt Widgets Designer d'utiliser la fonction qobject_cast() pour rechercher les interfaces prises en charge à l'aide d'un pointeur QObject uniquement.

Exposition d'une extension à Qt Widgets Designer

Dans Qt Widgets Designer, les extensions ne sont pas créées tant qu'elles ne sont pas nécessaires. C'est pourquoi, lorsque vous mettez en œuvre des extensions, vous devez sous-classer QExtensionFactory pour créer une classe capable de créer des instances de vos extensions. Vous devez également enregistrer votre fabrique auprès du gestionnaire d'extensions de Qt Widgets Designer; le gestionnaire d'extensions s'occupe de la construction des extensions.

Lorsqu'une extension est demandée, le gestionnaire d'extensions de Qt Widgets Designer parcourt les usines enregistrées en appelant QExtensionFactory::createExtension() pour chacune d'entre elles jusqu'à ce qu'il en trouve une capable de créer l'extension demandée pour le widget sélectionné. Cette usine créera alors une instance de l'extension.

Diagramme montrant la relation entre les composants de Qt Widgets Designer

Création d'une fabrique d'extensions

La classe QExtensionFactory fournit une fabrique d'extensions standard, mais elle peut également être utilisée comme interface pour des fabriques d'extensions personnalisées.

L'objectif est de réimplémenter la fonction QExtensionFactory::createExtension(), en la rendant capable de créer votre extension, telle qu'une extension de conteneur MultiPageWidget.

Vous pouvez soit créer un nouveau QExtensionFactory et réimplémenter la fonction QExtensionFactory::createExtension() :

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;
}

soit utiliser une fabrique existante, en étendant la fonction QExtensionFactory::createExtension() pour permettre à la fabrique de créer également votre extension personnalisée :

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;
    }
}

Accès au gestionnaire d'extensions de Qt Widgets Designer

Lorsque vous mettez en œuvre un plugin de widget personnalisé, vous devez sous-classer QDesignerCustomWidgetInterface pour exposer votre plugin à Qt Widgets Designer. Ce point est abordé plus en détail dans la section Création de widgets personnalisés pour Qt Widgets Designer. L'enregistrement d'une fabrique d'extensions se fait généralement dans la fonction 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;
}

Le paramètre formEditor de la fonction QDesignerCustomWidgetInterface::initialize() est un pointeur sur l'objet QDesignerFormEditorInterface actuel de Qt Widgets Designer. Vous devez utiliser la fonction QDesignerFormEditorInterface::extensionManager() pour récupérer une interface vers le gestionnaire d'extensions Qt Widgets Designer. Ensuite, vous utilisez la fonction QExtensionManager::registerExtensions() pour enregistrer votre usine d'extension personnalisée.

Pour plus d'informations sur la création d'extensions de widgets personnalisés dans Qt Widgets Designer, reportez-vous aux exemples d'extension de menu de tâches et d'extension de conteneur.

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