Plugins (Erweiterungen)
Extensions ist eine gemeinsam genutzte dynamische Bibliothek, die während der Ausführung der Hauptanwendung geladen werden soll und die mindestens eine spezielle Schnittstelle implementieren muss.
Erweiterungen werden in zwei Typen unterteilt:
- Für Qt
- Für native Anwendungen
Lassen Sie uns herausfinden, wie Sie Ihr eigenes Erweiterungssystem und die Erweiterungen selbst dafür erstellen.
Die Kommunikation mit der Nebenstelle erfolgt über die Schnittstelle (Signale, Slots und Klassenmethoden). Die Erweiterung wird von der Anwendung mithilfe der QPluginLoader- Klasse geladen. Zum Laden der Erweiterung wird die Methode instance () verwendet, die ein Erweiterungsobjekt erstellt und einen Zeiger darauf zurückgibt. Die unload () -Methode wird zum Entladen der Erweiterung verwendet.
Teil 1
Erstellen Sie im ersten Beispiel eine Erweiterung, die eine Funktion (Algorithmus, Formel) aus der Erweiterung verwendet.
Das visuelle Schema des Projekts sieht wie folgt aus.

Stufe 1:
Der erste Schritt besteht darin, eine von QObject geerbte Schnittstellenklasse zu erstellen. Als Schnittstelle gibt es eine Methode, die eine Variable vom Typ QString verwendet und dieselbe Zeichenfolge in Großbuchstaben zurückgibt. Mit dem Makro Q_DECLARE_INTERFACE setzen wir den Bezeichner der Schnittstellen, der Compiler c generiert Metainformationen für den Bezeichnerstring. Dieses Modul ist das Kommunikationsprotokoll zwischen dem Plug-In und dem Hauptprogramm und wird im Plug-In-Projekt und im Hauptprojekt verwendet.
Die Klasse sieht wie folgt aus.
Stufe 2:
Lassen Sie uns eine Basisanwendung erstellen, die die Erweiterung herunterlädt. Durch Drücken der Taste wird die Nebenstelle durchsucht und in das System geladen. Weiter über die Schnittstelle werden wir unsere Funktion nutzen.
Basisanwendung:
mainproject.h
mainproject.cpp
Stufe 3:
Wenn Sie eine Erweiterung erstellen, müssen Sie zunächst den Typ des Projekts ändern, das in der Pro-Datei erstellt wird. Dazu müssen Sie die folgende Zeile TEMPLATE = lib hinzufügen und die Projektkonfiguration für die Plugin-Erweiterung CONFIG + = festlegen.
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
Als nächstes erstellen wir eine Klasse für die zukünftige Erweiterung. Die Klasse sollte von der Klasse der Schnittstellen geerbt werden. Makro Q_INTERFACES , Sie benötigen den Compiler, um alle erforderlichen Metainformationen für die Erweiterung zu generieren. Das Makro Q_PLUGIN_METADATA () legt den Einstiegspunkt für die Erweiterung und den Zugriff für die Qt-Bibliothek fest. Sie müssen auch eine inteface.json-Datei mit Metainformationen erstellen (die Datei muss sich im Stammverzeichnis des Projekts befinden). In unserem Fall gibt es dort keine Informationen. Schreiben Sie also einfach leere Anführungszeichen {} in die Datei.
Upperstringplugin.h
Upperstringplugin.cpp
Bei der Ausgabe des Kompilierens des Projekts erhalten wir eine Datei mit der Erweiterung .so, verschieben diese Datei in den Plugins-Ordner des Hauptprojekts und starten sie. In diesem Fall wird die Erweiterung in das Hauptprogramm geladen und ein einzelnes Erweiterungsobjekt erstellt. Wenn Sie versuchen, die instance () - Funktion wiederzuverwenden, gibt die Funktion einen Zeiger auf das bereits erstellte Erweiterungsobjekt zurück.
Programmausführung

Teil 2
Um unsere Aufgabe zu verkomplizieren, benötigen wir jetzt die Erweiterung als Widget und die Möglichkeit, mehrere solcher Widgets zu erstellen. Das Hauptprogramm empfängt Nachrichten von Plugins und sendet eine Antwort zurück. Wir werden neue Projekte erstellen. In der ersten Phase benötigen wir zwei Klassen von Schnittstellen. Eine ist für das Laden der Erweiterung und das Erstellen des Widgets verantwortlich, die andere für den Betrieb des Widgets selbst.
Das Projektschema sieht wie folgt aus:

Stufe 1:
Die erste Schnittstellenklasse hat zwei Funktionen: Rufen Sie den Namen des Plugins und das Plugin-Widget ab. Der Name des Plugins wird zur Identifizierung im System gespeichert. Wir werden das Plugin-Widget zu den MDI-Fenstern der Hauptanwendung hinzufügen.
Die zweite Klasse ist das grafische Widget selbst. Es wird von QWidget geerbt. Hier haben wir die Funktionen angegeben, die wir benötigen. Das Widget empfängt eine Nachricht und sendet sie an das Hauptprogramm.
interface.h
Stufe 2:
Das Hauptprogramm besteht aus einem MDI-Fenster, in dem es ein Haupt-Widget zum Empfangen von Nachrichten von Plugins und zusätzliche Fenster gibt, die dynamisch angezeigt werden, wenn die Plugins aufgerufen werden.
Beim Erstellen eines Plugin-Widgets verbinden wir das Signal vom Plugin mit dem Steckplatz und erhalten mit der Funktion sender () einen Zeiger auf das Plugin, das die Nachricht gesendet hat. Wir platzieren das erstellte Widget im MDI-Fenster, und das Plug-In-Objekt selbst kann vom System entladen werden.
mainproject.h
mainproject.cpp
Das Hauptfenster akzeptiert die Nachricht und zeigt sie an.
mainwidget.h
mainwidget.cpp
Stufe 2:
Wir erstellen ein Plugin. Die Idee ist, dass es eine Fabrik zum Erstellen eines Widgets ist.
plugin.h
plugin.cpp
Vom Plugin erstelltes Widget.
texttranferwidget.h
texttranferwidget.cpp
Die Ausgabe des Hauptprogramms:
