R
RJM8 октября 2018 г. 9:41

библиотека 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
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Вам это нравится? Поделитесь в социальных сетях!

6
R
  • 8 октября 2018 г. 9:53

Так же попробовал добавление библиотеки через *.а файл в проекте приложения подгружающего библиотеку

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
 
win32:CONFIG(release, debug|release): LIBS += -L$$PWD/../../libr/build-gujdll-MinGW-Release/release/ -lgujdll
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/../../libr/build-gujdll-MinGW-Release/debug/ -lgujdll
else:unix: LIBS += -L$$PWD/../../libr/build-gujdll-MinGW-Release/ -lgujdll
 
INCLUDEPATH += $$PWD/../../libr/build-gujdll-MinGW-Release/release
DEPENDPATH += $$PWD/../../libr/build-gujdll-MinGW-Release/release
Это ничего не дало, ошибки те же. 


    Evgenii Legotckoi
    • 8 октября 2018 г. 9:57

    Добрый день!

    Во первых QDialog от которого вы наследовали Gujdll не имеет метода run(), его нужно открывать либо методом show() либо exec() .

    Но это та проблема с который бы столкнулись дальше.

    Во вторых... вы не правильно подключили библиотеку... gujdll_global.h и global.h здесь точно лишний

    HEADERS  += widget.h \
        gujdll.h \
        gujdll_global.h

    В проекте, где вы подключаете библиотеку

    Подключение библиотеки производится иным способом, если правильно помню, то нужно указаеть LIBS и INCLUDEPATH

    INCLUDEPATH += "$$PWD/myLibrary"
    LIBS += "$$PWD/myLibrary/mylibrary.dll"

    INCLUDEPATH указывает, где находятся хедеры, а LIBS, где находится dll

    $$PWD указывается место нахождение вашего pro файла, заметьте место нахождения pro файла проекта, а не pro файла библиотеки. То есть поулчается отеносительный путь.





      R
      • 8 октября 2018 г. 10:44



      В созданном приложении 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 не совсем понял как обойтись.



      Евгений, могу ли я Вас попросить описать процедуру добавления созданной библиотеки.

        Evgenii Legotckoi
        • 9 октября 2018 г. 3:36

        После работы сегодня накидаю пример в качестве статьи тогда уже лучше.

          R
          • 9 октября 2018 г. 5:57

          Огромное спасибо!

            Комментарии

            Только авторизованные пользователи могут публиковать комментарии.
            Пожалуйста, авторизуйтесь или зарегистрируйтесь
            AD

            C++ - Тест 004. Указатели, Массивы и Циклы

            • Результат:50баллов,
            • Очки рейтинга-4
            m
            • molni99
            • 26 октября 2024 г. 1:37

            C++ - Тест 004. Указатели, Массивы и Циклы

            • Результат:80баллов,
            • Очки рейтинга4
            m
            • molni99
            • 26 октября 2024 г. 1:29

            C++ - Тест 004. Указатели, Массивы и Циклы

            • Результат:20баллов,
            • Очки рейтинга-10
            Последние комментарии
            i
            innorwall14 ноября 2024 г. 21:26
            Qt/C++ - Урок 031. QCustomPlot - строим график по времени buy generic priligy We can just chat, and we will not lose too much time anyway
            i
            innorwall14 ноября 2024 г. 19:03
            Qt/C++ - Урок 060. Настройка внешнего вида приложения в рантайме I didnt have an issue work colors priligy dapoxetine 60mg revia cost uk August 3, 2022 Reply
            i
            innorwall14 ноября 2024 г. 11:42
            Как Копировать Файлы в Linux If only females relatives with DZ offspring were considered these percentages were 23 order priligy online uk
            i
            innorwall14 ноября 2024 г. 9:09
            Qt/C++ - Урок 068. Hello World с использованием системы сборки CMAKE в CLion ditropan pristiq dosing With the Yankees leading, 4 3, Rivera jogged in from the bullpen to a standing ovation as he prepared for his final appearance in Chicago buy priligy pakistan
            Сейчас обсуждают на форуме
            i
            innorwall14 ноября 2024 г. 3:39
            добавить qlineseries в функции priligy amazon canada 93 GREB1 protein GREB1 AB011147 6
            i
            innorwall11 ноября 2024 г. 10:55
            Всё ещё разбираюсь с кешем. priligy walgreens levitra dulcolax carbs The third ring was found to be made up of ultra relativistic electrons, which are also present in both the outer and inner rings
            9
            9Anonim25 октября 2024 г. 9:10
            Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…
            ИМ
            Игорь Максимов3 октября 2024 г. 4:05
            Реализация навигации по разделам Спасибо Евгений!

            Следите за нами в социальных сетях