библиотека dll с графическим интерфейсом на Qt
Добрый день!
Задачей является написание расчетного блока для одного ПО (сказали что там симбиоз Джава и Питона). В общем то что мне надо написать должно проводить расчеты, выдавать визуализацию расчетов (через gui написанный мной) и обрабатывать пользовательские действия (например нажатие кнопок или выбор настроек через сигналы-слоты).
Т.к. основное ПО для которого надо создать такой функционал является франкенштейном из разных языков и работает под Виндовс, то я решил выбрать вариант с созданием библиотеки dll (тут я не совсем уверен хорошее это решение или нет. Если лучше будет написать под эти нужды плагин средствами Qt, то плз объясните почему).
Прежде чем приступить к написанию основного кода решил создать проект и dll к нему. Из основного приложения по нажатию кнопки должно отобразится окно описанное в dll библиотеке (класс унаследован от QDialog). Код проектов ниже:
---> Код библиотеки dll
pro file
QT += core gui TARGET = gujdll TEMPLATE = lib DEFINES += GUJDLL_LIBRARY SOURCES += gujdll.cpp HEADERS += gujdll.h\ gujdll_global.h QMAKE_CXXFLAGS += -std=c++0x unix { target.path = /usr/lib INSTALLS += target }
Хедер глобального файла с описанием макросов
#ifndef GUJDLL_GLOBAL_H #define GUJDLL_GLOBAL_H #include <QtCore/qglobal.h> #if defined(GUJDLL_LIBRARY) # define GUJDLLSHARED_EXPORT Q_DECL_EXPORT #else # define GUJDLLSHARED_EXPORT Q_DECL_IMPORT #endif #endif // GUJDLL_GLOBAL_H
Хедер класса
#ifndef GUJDLL_H #define GUJDLL_H #include "gujdll_global.h" #include <QApplication> #include <QDialog> #include <QVBoxLayout> #include <QPushButton> #include <QTextBrowser> class GUJDLLSHARED_EXPORT Gujdll : public QDialog { Q_OBJECT public: explicit Gujdll(QDialog *parent = 0); QPushButton txt; QPushButton exit; QTextBrowser browser; QVBoxLayout main_lay; bool demo; int lang; void run(); public slots: void print_info(); void finish(); }; #endif // GUJDLL_H
Cpp класса
#include "gujdll.h" int *argc = nullptr; char **argv = nullptr; QApplication *app = nullptr; Gujdll *win = nullptr; static void startup() { argc = new int(1); argv = new char*[1]; argv[0] = strdup("dummy"); app = new QApplication(*argc, argv); win = new Gujdll(); win->show(); app->processEvents(); } static void shutdown() { delete win; delete app; delete argv[0]; delete [] argv; delete argc; } Gujdll::Gujdll(QDialog *parent) : QDialog(parent) { demo = false; lang = 1; main_lay.addWidget(&browser); main_lay.addWidget(&txt); main_lay.addWidget(&exit); setLayout(&main_lay); QObject::connect(&txt,SIGNAL(clicked(bool)),this,SLOT(print_info())); QObject::connect(&exit,SIGNAL(clicked(bool)),this,SLOT(finish())); } void Gujdll::run() { startup(); } void Gujdll::print_info() { QString msg = ""; msg += demo; msg += " "; msg += QString::number(lang); browser.append(msg); } void Gujdll::finish() { shutdown(); }
Собирается библиотека без каких-либо ошибок и замечаний.
Далее код приложения использующего эту библиотеку:
pro file в котором указан путь к папке где лежит библиотека
QT += core gui greaterThan(QT_MAJOR_VERSION, 4): QT += widgets TARGET = checker TEMPLATE = app LIBS += "C:\Users\RYM\Desktop\libtest\torun\build-checker-MinGW-Release\release\gujdll.dll" SOURCES += main.cpp\ widget.cpp HEADERS += widget.h \ gujdll.h \ gujdll_global.h FORMS += widget.ui
Хедер класса использующего библиотеку (в нем я подключаю инклуды хедеров библиотек, которые скопировал в папку проекта приложения)
#ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include "gujdll.h" namespace Ui { class Widget; } class Widget : public QWidget { Q_OBJECT public: explicit Widget(QWidget *parent = 0); ~Widget(); private: Ui::Widget *ui; public slots: void rundll(); }; #endif // WIDGET_H
Срр код приложения
#include "widget.h" #include "ui_widget.h" Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { ui->setupUi(this); QObject::connect(ui->pushButton,SIGNAL(clicked(bool)),this,SLOT(rundll())); } Widget::~Widget() { delete ui; } void Widget::rundll() { Gujdll lib; lib.run(); }Библиотеку собрал под релиз и приложение, использующее библиотеку, тоже запускаю под релизом. Тут пролем не должно быть. Но при сборке приложения, использующего библиотеку, появляются такие ошибки:Вроде запускаю обьект QApplication со своим циклом, в котором все варится и все должно быть нормально. Толком ничего по этому вопросу не нашел. Прошу помочь, заранее спасибо =)
Рекомендуємо хостинг TIMEWEB
Стабільний хостинг, на якому розміщується соціальна мережа EVILEG. Для проектів на Django радимо VDS хостинг.Вам це подобається? Поділіться в соціальних мережах!
- Akiv Doros
- 11 листопада 2024 р. 14:58
C++ - Тест 004. Указатели, Массивы и Циклы
- Результат:50бали,
- Рейтинг балів-4
- molni99
- 26 жовтня 2024 р. 01:37
C++ - Тест 004. Указатели, Массивы и Циклы
- Результат:80бали,
- Рейтинг балів4
- molni99
- 26 жовтня 2024 р. 01:29
C++ - Тест 004. Указатели, Массивы и Циклы
- Результат:20бали,
- Рейтинг балів-10
Так же попробовал добавление библиотеки через *.а файл в проекте приложения подгружающего библиотеку
Добрый день!
Во первых QDialog от которого вы наследовали Gujdll не имеет метода run(), его нужно открывать либо методом show() либо exec() .
Но это та проблема с который бы столкнулись дальше.
Во вторых... вы не правильно подключили библиотеку... gujdll_global.h и global.h здесь точно лишний
В проекте, где вы подключаете библиотеку
Подключение библиотеки производится иным способом, если правильно помню, то нужно указаеть LIBS и INCLUDEPATH
INCLUDEPATH указывает, где находятся хедеры, а LIBS, где находится dll
$$PWD указывается место нахождение вашего pro файла, заметьте место нахождения pro файла проекта, а не pro файла библиотеки. То есть поулчается отеносительный путь.
В созданном приложении app я делаю следующее:
1) беру 2 заголовочных файла библиотеки gujdll_global.h и global.h, кидаю их в папку pro файла приложения, которое будет юзать библиотеку
2) dll библиотеку (релиз версию) я копирую в папку с релизным exe программы.
3) добавляю gujdll_global.h и global.h в проект через Add existing files и в widget.h прописываю инклуд для global.h
Далее с самим dll не совсем понял как обойтись.
Евгений, могу ли я Вас попросить описать процедуру добавления созданной библиотеки.
После работы сегодня накидаю пример в качестве статьи тогда уже лучше.
Огромное спасибо!
В общем вот туториал по созданию проекта с подключённой внешней библиотекой