Plugins (extensions)
Les extensions sont une bibliothèque dynamique partagée conçue pour être chargée lors de l'exécution de l'application principale, qui doit nécessairement implémenter au moins une interface spéciale.
Les extensions sont divisées en deux types:
- Pour Qt
- Pour les applications natives
Voyons comment créer votre propre système d'extension et les extensions elles-mêmes.
La communication avec l'extension s'effectue via l'interface (signaux, slots et méthodes de classe). L'extension est chargée par l'application à l'aide de la classe QPluginLoader . Pour charger l'extension, la méthode instance () est utilisée, ce qui crée un objet d'extension et lui renvoie un pointeur. La méthode unload () est utilisée pour décharger l'extension.
Partie 1
Dans le premier exemple, créez une extension qui utilisera une fonction (algorithme, formule) à partir de l'extension.
Le schéma visuel du projet se présentera comme suit.

Étape 1:
La première étape consiste à créer une classe d'interface héritée de QObject, comme interface il y aura une méthode qui prend une variable de type QString et retourne la même chaîne en majuscules. En utilisant la macro Q_DECLARE_INTERFACE, nous définissons l'identifiant des interfaces, le compilateur c génère des méta-informations pour la chaîne d'identifiant. Ce module est le protocole de communication entre le plug-in et le programme principal et sera utilisé dans le projet de plug-in et dans le projet principal.
La classe se présentera comme suit.
Étape 2:
Créons une application de base qui téléchargera l'extension. En appuyant sur le bouton, l'extension sera recherchée et chargée dans le système. Plus loin dans l'interface, nous utiliserons notre fonction.
Application de base:
mainproject.h
mainproject.cpp
Étape 3:
En créant une extension, la première chose à faire est de changer le type du projet en cours de construction dans le fichier pro, pour cela vous devez ajouter la ligne suivante TEMPLATE = lib, et définir la configuration du projet pour l'extension du plug-in CONFIG + =.
upperstringplugin.pro
#------------------------------------------------- # # Project created by QtCreator 2019-04-03T11:35:18 # #------------------------------------------------- QT += core greaterThan(QT_MAJOR_VERSION, 4): QT += widgets TARGET = upperStringPlugin TEMPLATE = lib CONFIG += plugin DESTDIR = ../Plugins DEFINES += QT_DEPRECATED_WARNINGS CONFIG += c++11 SOURCES += \ upperstringplugin.cpp HEADERS += \ upperstringplugin.h \ interface.h
Ensuite, nous créons une classe pour la future extension, la classe doit être héritée de la classe des interfaces. Macro Q_INTERFACES , vous avez besoin du compilateur pour générer toutes les méta-informations nécessaires pour l'extension. La macro Q_PLUGIN_METADATA () définit le point d'entrée sur l'extension et l'accès pour la bibliothèque Qt. Vous devez également créer un fichier inteface.json avec des méta-informations (le fichier doit être à la racine du projet), dans notre cas, il n'y a aucune information, alors écrivez simplement des guillemets vides {} dans le fichier.
upperstringplugin.h
upperstringplugin.cpp
À la sortie de la compilation du projet, nous obtenons un fichier avec l'extension .so, déplaçons ce fichier dans le dossier Plugins du projet principal et le démarrons. Dans ce cas, l'extension est chargée dans le programme principal et un seul objet d'extension est créé. Si vous essayez de réutiliser la fonction instance (), la fonction renverra un pointeur sur l'objet d'extension déjà créé.
Exécution du programme

2e partie
Pour compliquer notre tâche, nous avons maintenant besoin que l'extension soit un widget et la possibilité de créer plusieurs de ces widgets. Le programme principal recevra des messages des plugins et renverra une réponse. Nous allons créer de nouveaux projets, dans un premier temps nous aurons besoin de deux classes d'interfaces, l'une sera chargée du chargement de l'extension et de la création du widget, l'autre du fonctionnement du widget lui-même.
Le schéma du projet se présentera comme suit:

Étape 1:
La première classe d'interface aura deux fonctions, obtenir le nom du plugin et obtenir le widget du plugin. Le nom du plugin sera stocké pour identification dans le système. Nous ajouterons le widget du plugin aux fenêtres MDI de l'application principale.
La deuxième classe est le widget graphique lui-même, il est hérité de QWidget, ici nous avons spécifié les fonctions dont nous avons besoin, le widget recevra un message et l'enverra au programme principal.
interface.h
Étape 2:
Le programme principal se compose d'une fenêtre MDI, dans laquelle il y a un widget principal pour recevoir des messages des plugins et des fenêtres supplémentaires qui apparaissent dynamiquement lorsque les plugins sont appelés.
Lors de la création d'un widget de plugin, nous connectons le signal du plugin à l'emplacement et en utilisant la fonction sender () nous obtenons un pointeur sur le plugin qui a envoyé le message. Nous plaçons le widget créé dans la fenêtre MDI et l'objet plug-in lui-même peut être déchargé du système.
mainproject.h
mainproject.cpp
La fenêtre principale accepte le message et l'affiche.
mainwidget.h
mainwidget.cpp
Étape 2:
Nous créons un plugin, son idée est que c'est une usine pour créer un widget.
plugin.h
plugin.cpp
Widget créé par le plugin.
texttranferwidget.h
texttranferwidget.cpp
Le résultat du programme principal:
