[QT] Пользовательский проект, упакованный в DLL, и как его вызвать (с пользовательским интерфейсом)

1. Инкапсуляция динамической библиотеки

1. Сначала создайте новый проект библиотеки

вставьте сюда описание изображения

2. Измените тип на разделяемую библиотеку, настройте имя проекта и путь к проекту.

вставьте сюда описание изображения

3. Выберите компилятор

вставьте сюда описание изображения

4. Выберите модули, необходимые для динамической библиотеки.

вставьте сюда описание изображения

5. Настройте имя класса, нажмите «Далее».

вставьте сюда описание изображения

6. Нажмите Далее

вставьте сюда описание изображения

7. Обзор проекта

вставьте сюда описание изображения

8. В данный момент в файле нет файла ui, потому что для инкапсуляции динамической библиотеки с интерфейсом нужно щелкнуть проект правой кнопкой мыши -> добавить новый

вставьте сюда описание изображения

9. Выберите Qt -> Класс интерфейса дизайнера Qt в новом всплывающем окне.

вставьте сюда описание изображения

10. Выберите шаблон интерфейса виджета

вставьте сюда описание изображения

11. Назовите его так же, как текущий проект, чтобы перезаписать предыдущий файл без пользовательского интерфейса.

вставьте сюда описание изображения

12. Нажмите Готово

вставьте сюда описание изображения

13. После этого появятся следующие два окна, нажмите OK и Да для всех соответственно.

вставьте сюда описание изображения
вставьте сюда описание изображения

14. На этом этапе вы можете видеть, что в файле проекта есть больше файлов .ui.

вставьте сюда описание изображения

15. Нажмите на файл .pro, чтобы удалить повторяющийся контент.

вставьте сюда описание изображения

16. Если файл сообщает красный цвет, это означает, что некоторые модули отсутствуют (отсутствует модуль виджетов)

вставьте сюда описание изображения

17. Добавьте следующее, ошибка может исчезнуть

вставьте сюда описание изображения

18. Однако проект в настоящее время не может быть напрямую упакован в динамическую библиотеку, потому что старый файл перезаписывается, а новый файл не может быть упакован в динамическую библиотеку, поэтому новый файл необходимо изменить.

I. На данный момент содержимое нового файла DynamicLib.h выглядит следующим образом:
вставьте сюда описание изображения
II.Его необходимо изменить до следующего содержания:
необходимо добавить заголовочный файл #include "dynamiclib_global.h" и добавить оператор перед именем класса DYNAMICLIBSHARED_EXPORT.
вставьте сюда описание изображения
III. DYNAMICLIBSHARED_EXPORTОператор может быть скопирован непосредственно в заголовочный файл dynamiclib_global.h, который является частью, обведенной красным прямоугольником в приведенном ниже коде:
вставьте сюда описание изображения

19. Добавьте кнопку на этот интерфейс и добавьте к этой кнопке соответствующую функцию слота.

вставьте сюда описание изображения

20. Напишите содержание функции слота

вставьте сюда описание изображения

21. Затем нажмите «Сборка и запуск», чтобы сгенерировать файл динамической библиотеки.

вставьте сюда описание изображения

22. Сгенерированный файл библиотеки находится в собственной папке Debug.

вставьте сюда описание изображения

23. Еще один файл, который необходимо использовать, это собственный заголовочный файл, dynamiclib_global.hкоторый также необходимо привести

вставьте сюда описание изображения
На этом инкапсуляция динамической библиотеки завершена, и необходимо использовать четыре файла, отмеченные выше.

Во-вторых, вызов динамической библиотеки: использовать эту динамическую библиотеку в другом новом проекте.

1. Создайте новый проект с интерфейсом

вставьте сюда описание изображения

2. Обзор проекта

вставьте сюда описание изображения

3. Затем добавьте две новые папки include и lib в каталог проекта LibTest.

  • Поместите файлы DynamicLib.hи dynamiclib_global.hв includeпапку
  • будет DynamicLib.libпомещен libв папку

вставьте сюда описание изображения

4. Затем добавьте следующий оператор в файл LibTest.pro, чтобы импортировать динамическую библиотеку.

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

вставьте сюда описание изображения

Он указывает путь к заголовочному файлу, требуемому динамической библиотекой, путь, по которому находится динамическая библиотека, и имя динамической библиотеки. $$PWD указывает каталог проекта, а -l указывает имя файла библиотеки без суффикса .lib.
Затем добавьте файлы заголовков, которые необходимо использовать в файлах, использующих динамическую библиотеку для использования.

5. Затем приступайте к редактированию mainwindow.ui

Добавьте компонент StackedWidget, поместите кнопку на первую страницу, нажмите эту кнопку, перейдите на вторую страницу и поместите инкапсулированный интерфейс динамической библиотеки на вторую страницу.
вставьте сюда описание изображения

6. Сначала добавьте функцию слота в pushButton

вставьте сюда описание изображения

7. Затем добавьте объект DynamicLib в MainWindow и импортируйте заголовочный файл динамической библиотеки.

вставьте сюда описание изображения

8. Добавьте следующий код в конструктор

вставьте сюда описание изображения

9. В это время будет проблема: программа аварийно завершается и не может успешно работать.

вставьте сюда описание изображения

10. Это потому, что есть еще файл, который не используется, то есть файл dll, и DynamicLib.dllфайл нужно поместить LibTest.exeв папку того же уровня, иначе программа не может найти динамическую библиотеку при запуске, и программа рухнет

Так как это этап отладки, то файл LibTest.exe находится в папке отладки, так что сюда кидаем dll:

вставьте сюда описание изображения
Таким же образом, после того, как релиз упакован, dll все еще может быть помещен в тот же каталог, что и exe-файл.

11. Затем пересоберите и запустите

Программа успешно запускается:
вставьте сюда описание изображения

12. Нажмите кнопку, чтобы перейти ко второму интерфейсу.

вставьте сюда описание изображения

13. Нажмите кнопку проверки еще раз.

вставьте сюда описание изображения
Вы можете видеть, что строка напечатана ниже Dynamic Link Lib Test!!! , указывая на то, что динамическую библиотеку можно вызывать в обычном режиме.

3. Дополнение: Простой метод

Если сейчас есть процесс GUI с именем CustomMessageBox, и вы хотите изменить его на DLL, вам необходимо внести следующие изменения ( обратите внимание, что красная часть — это заглавная буква имени класса, и вам нужно изменить содержимое красная текстовая часть в соответствии с реальной ситуацией. ):

1. Измените файл конфигурации

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

2. Добавьте следующий код в заголовочный файл экспортируемого класса.

1 #если определено( CUSTOMMESSAGEBOX _LIBRARY)
2 # определить CUSTOMMESSAGEBOX SHARED_EXPORT Q_DECL_EXPORT
3 #else
4 # определить CUSTOMMESSAGEBOX SHARED_EXPORT Q_DECL_IMPORT
5 #endif

3. Измените определение класса экспорта

1 // класс CustomMessageBox : общедоступный QDialog
2 класс CUSTOMMESSAGEBOX SHARED_EXPORT CustomMessageBox : общедоступный QDialog

4. Скомпилируйте

Если это компилятор, вы найдете и файлы MinGW32в папке после компиляции ; если это компилятор, это должно быть и .***.dll***.aMSVC***.dll***.lib

5. Используйте

В программе, использующей эту библиотеку, создайте новую includeпапку, скопируйте ***.aфайл и 导出类的头文件в эту папку, а заголовочный файл импортируйте в программу. После компиляции поместите dllфайлы, скомпилированные в разных режимах, в папку после компиляции программы, чтобы программа могла нормально работать.

Supongo que te gusta

Origin blog.csdn.net/Cappuccino_jay/article/details/126115946
Recomendado
Clasificación