[QT] In DLL gepacktes benutzerdefiniertes Projekt und wie man es aufruft (mit UI-Schnittstelle)

1. Kapselung der dynamischen Bibliothek

1. Erstellen Sie zunächst ein neues Bibliotheksprojekt

Fügen Sie hier eine Bildbeschreibung ein

2. Ändern Sie den Typ in eine gemeinsam genutzte Bibliothek und passen Sie den Projektnamen und den Projektpfad an

Fügen Sie hier eine Bildbeschreibung ein

3. Wählen Sie den Compiler aus

Fügen Sie hier eine Bildbeschreibung ein

4. Wählen Sie die für die dynamische Bibliothek erforderlichen Module aus

Fügen Sie hier eine Bildbeschreibung ein

5. Passen Sie den Klassennamen an und klicken Sie auf Weiter

Fügen Sie hier eine Bildbeschreibung ein

6. Klicken Sie auf Weiter

Fügen Sie hier eine Bildbeschreibung ein

7. Projektübersicht

Fügen Sie hier eine Bildbeschreibung ein

8. Derzeit ist keine UI-Datei in der Datei vorhanden, da Sie zum Kapseln der dynamischen Bibliothek mit der Schnittstelle mit der rechten Maustaste auf das Projekt klicken -> Neu hinzufügen müssen

Fügen Sie hier eine Bildbeschreibung ein

9. Wählen Sie im neuen Popup-Fenster Qt -> Qt-Designer-Schnittstellenklasse

Fügen Sie hier eine Bildbeschreibung ein

10. Wählen Sie die Widget-Schnittstellenvorlage aus

Fügen Sie hier eine Bildbeschreibung ein

11. Benennen Sie es mit demselben Namen wie das aktuelle Projekt, um die vorherige Datei ohne UI-Schnittstelle zu überschreiben

Fügen Sie hier eine Bildbeschreibung ein

12. Klicken Sie auf Fertig stellen

Fügen Sie hier eine Bildbeschreibung ein

13. Danach werden die folgenden beiden Fenster angezeigt. Klicken Sie auf „OK“ bzw. „Ja für alle“.

Fügen Sie hier eine Bildbeschreibung ein
Fügen Sie hier eine Bildbeschreibung ein

14. An diesem Punkt können Sie sehen, dass sich unter der Projektdatei weitere .ui-Dateien befinden

Fügen Sie hier eine Bildbeschreibung ein

15. Klicken Sie auf die .pro-Datei, um doppelte Inhalte zu löschen

Fügen Sie hier eine Bildbeschreibung ein

16. Wenn in der Datei Rot angezeigt wird, bedeutet dies, dass einige Module fehlen (das Widgets-Modul fehlt).

Fügen Sie hier eine Bildbeschreibung ein

17. Fügen Sie Folgendes hinzu, der Fehler kann verschwinden

Fügen Sie hier eine Bildbeschreibung ein

18. Allerdings kann das Projekt derzeit nicht direkt in eine dynamische Bibliothek gepackt werden, da die alte Datei überschrieben wird und die neue Datei nicht in eine dynamische Bibliothek gepackt werden kann, sodass die neue Datei geändert werden muss

I. Zu diesem Zeitpunkt lautet der Inhalt der neuen DynamicLib.h-Datei wie folgt:
Fügen Sie hier eine Bildbeschreibung ein
II. Sie muss in den folgenden Inhalt geändert werden:
Es ist erforderlich, eine Header-Datei hinzuzufügen #include "dynamiclib_global.h" und vor dem Klassennamen eine Anweisung hinzuzufügen DYNAMICLIBSHARED_EXPORT.
Fügen Sie hier eine Bildbeschreibung ein
III. DYNAMICLIBSHARED_EXPORTDie Anweisung kann direkt in die Header-Datei kopiert werden dynamiclib_global.h, das ist der Teil, der im folgenden Code durch das rote Kästchen eingekreist ist:
Fügen Sie hier eine Bildbeschreibung ein

19. Fügen Sie dieser Schnittstelle eine Schaltfläche hinzu und fügen Sie dieser Schaltfläche die entsprechende Slot-Funktion hinzu

Fügen Sie hier eine Bildbeschreibung ein

20. Schreiben Sie den Inhalt der Slot-Funktion

Fügen Sie hier eine Bildbeschreibung ein

21. Klicken Sie dann auf „Erstellen und ausführen“, um eine dynamische Bibliotheksdatei zu generieren

Fügen Sie hier eine Bildbeschreibung ein

22. Die generierte Bibliotheksdatei befindet sich in einem eigenen Debug-Ordner

Fügen Sie hier eine Bildbeschreibung ein

23. Eine weitere Datei, die verwendet werden muss, ist eine eigene Header-Datei, dynamiclib_global.hdie ebenfalls mitgebracht werden muss

Fügen Sie hier eine Bildbeschreibung ein
Zu diesem Zeitpunkt ist die Kapselung der dynamischen Bibliothek abgeschlossen und die zu verwendenden Dateien sind die vier oben markierten.

Zweitens der Aufruf der dynamischen Bibliothek: Verwenden Sie diese dynamische Bibliothek in einem anderen neuen Projekt

1. Erstellen Sie ein neues Projekt mit Schnittstelle

Fügen Sie hier eine Bildbeschreibung ein

2. Projektübersicht

Fügen Sie hier eine Bildbeschreibung ein

3. Fügen Sie dann zwei neue Ordner include und lib im LibTest-Projektverzeichnis des Projekts hinzu

  • Legen Sie die Dateien DynamicLib.hund im Ordner abdynamiclib_global.hinclude
  • wird im Ordner DynamicLib.libabgelegtlib

Fügen Sie hier eine Bildbeschreibung ein

4. Fügen Sie dann die folgende Anweisung in die Datei LibTest.pro ein, um die dynamische Bibliothek zu importieren

INCLUDEPATH += $$PWD/include
LIBS += -L$$PWD/lib -lDynamicLib

Fügen Sie hier eine Bildbeschreibung ein

Es zeigt den von der dynamischen Bibliothek benötigten Header-Dateipfad, den Pfad, in dem sich die dynamische Bibliothek befindet, und den Namen der dynamischen Bibliothek an. $$PWD gibt das Projektverzeichnis an und -l gibt den Namen der Bibliotheksdatei ohne das Suffix .lib an.
Fügen Sie dann die Header-Dateien hinzu, die in den Dateien verwendet werden müssen, die von der dynamischen Bibliothek verwendet werden.

5. Beginnen Sie dann mit der Bearbeitung von mainwindow.ui

Fügen Sie eine StackedWidget-Komponente hinzu, fügen Sie eine Schaltfläche auf der ersten Seite ein, klicken Sie auf diese Schaltfläche, springen Sie zur zweiten Seite und platzieren Sie die gekapselte dynamische Bibliotheksschnittstelle auf der zweiten Seite.
Fügen Sie hier eine Bildbeschreibung ein

6. Fügen Sie zunächst eine Slot-Funktion zu pushButton hinzu

Fügen Sie hier eine Bildbeschreibung ein

7. Fügen Sie dann ein DynamicLib-Objekt in MainWindow hinzu und importieren Sie die Header-Datei der dynamischen Bibliothek

Fügen Sie hier eine Bildbeschreibung ein

8. Fügen Sie den folgenden Code im Konstruktor hinzu

Fügen Sie hier eine Bildbeschreibung ein

9. Zu diesem Zeitpunkt tritt ein Problem auf: Das Programm wird abnormal beendet und kann nicht erfolgreich ausgeführt werden

Fügen Sie hier eine Bildbeschreibung ein

10. Dies liegt daran, dass es eine andere Datei gibt, die nicht verwendet wird, nämlich die DLL-Datei, und DynamicLib.dlldie Datei in einem Ordner auf derselben Ebene abgelegt werden muss LibTest.exe, da das Programm sonst die dynamische Bibliothek beim Ausführen nicht findet das Programm wird abstürzen

Da dies die Debug-Phase ist, befindet sich die Datei LibTest.exe im Debug-Ordner. Legen Sie die DLL daher hier ab:

Fügen Sie hier eine Bildbeschreibung ein
Auf die gleiche Weise kann die DLL nach dem Packen der Version immer noch im selben Verzeichnis wie die Exe-Datei abgelegt werden.

11. Dann neu erstellen und ausführen

Das Programm startet erfolgreich:
Fügen Sie hier eine Bildbeschreibung ein

12. Klicken Sie auf die Schaltfläche, um zur zweiten Schnittstelle zu springen

Fügen Sie hier eine Bildbeschreibung ein

13. Klicken Sie erneut auf die Testschaltfläche

Fügen Sie hier eine Bildbeschreibung ein
Sie können sehen, dass die Zeichenfolge unten gedruckt wird Dynamic Link Lib Test!!! , was darauf hinweist, dass die dynamische Bibliothek normal aufgerufen werden kann.

3. Ergänzung: Einfache Methode

Wenn es jetzt einen GUI-Prozess mit dem Namen CustomMessageBox gibt und Sie ihn in eine DLL ändern möchten, müssen Sie die folgenden Änderungen vornehmen ( beachten Sie, dass der rote Teil der Großbuchstabe des Klassennamens ist und Sie den Inhalt des ändern müssen roter Textteil entsprechend der tatsächlichen Situation. ):

1. Ändern Sie die Konfigurationsdatei

1 #TEMPLATE = app
2
3 DEFINES += CUSTOMMESSAGEBOX _LIBRARY
4 TEMPLATE = lib

2. Fügen Sie den folgenden Code zur Header-Datei der exportierten Klasse hinzu

1 #wenn definiert( CUSTOMMESSAGEBOX _LIBRARY)
2 # CUSTOMMESSAGEBOX SHARED_EXPORT Q_DECL_EXPORT definieren
3 #else 4 # CUSTOMMESSAGEBOX SHARED_EXPORT Q_DECL_IMPORT
definieren 5 #endif

3. Ändern Sie die Definition der Exportklasse

1 //Klasse CustomMessageBox: öffentlicher QDialog
2 Klasse CUSTOMMESSAGEBOX SHARED_EXPORT CustomMessageBox: öffentlicher QDialog

4. Kompilieren

Wenn es sich um einen Compiler handelt , finden Sie nach der Kompilierung Dateien MinGW32im Ordner „and“ ; wenn es sich um einen Compiler handelt, sollte es „ and“ sein .***.dll***.aMSVC***.dll***.lib

5. Verwendung

Erstellen Sie in dem Programm, das diese Bibliothek verwendet, einen neuen includeOrdner, kopieren Sie ***.adie Datei 导出类的头文件in diesen Ordner und importieren Sie die Header-Datei in das Programm. Legen Sie nach dem Kompilieren dlldie in verschiedenen Modi kompilierten Dateien in den Ordner nach dem Kompilieren des Programms ab, damit das Programm normal ausgeführt werden kann.

おすすめ

転載: blog.csdn.net/Cappuccino_jay/article/details/126115946