R
RJM8 октября 2018 г. 19: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 г. 19: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 г. 19: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 г. 20: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 г. 13:36

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

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

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

            Комментарии

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

            Qt - Тест 001. Сигналы и слоты

            • Результат:84баллов,
            • Очки рейтинга4
            Ua

            Qt - Тест 001. Сигналы и слоты

            • Результат:42баллов,
            • Очки рейтинга-8
            ОК

            Qt - Тест 001. Сигналы и слоты

            • Результат:47баллов,
            • Очки рейтинга-6
            Последние комментарии
            ИМ
            Игорь Максимов22 ноября 2024 г. 21:51
            Django - Урок 017. Кастомизированная страница авторизации на Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
            Evgenii Legotckoi
            Evgenii Legotckoi31 октября 2024 г. 23:37
            Django - Урок 064. Как написать расширение для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
            A
            ALO1ZE19 октября 2024 г. 17:19
            Читалка fb3-файлов на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
            ИМ
            Игорь Максимов5 октября 2024 г. 16:51
            Django - Урок 064. Как написать расширение для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
            d
            dblas55 июля 2024 г. 20:02
            QML - Урок 016. База данных SQLite и работа с ней в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
            Сейчас обсуждают на форуме
            f
            firstlunoxod15 февраля 2025 г. 13:46
            Рисование на QGraphicsScene при зажатой кнопке мыши Подскажите, пожалуйста! Как данный класс можно дополнить, чтобы созданные объекты можно было перемещать мышкой по сцене?
            Дмитрий
            Дмитрий3 февраля 2025 г. 16:24
            Создание deb-пакета. Как создать ярлык на рабочем столе после установки собственного deb-пакета? Всем привет. Сделал свой deb-пакет с программой. Всё устанавливается и работает. Ставлю по пути /usr/bin/my_application. Как для пользователя при установке пакета сразу создать ярлык на раб…
            NW
            Nayo Wai30 января 2025 г. 19:22
            не запускается компьютер!!! Не запускается компьютер (точнее работает блок , но сам монитор вообще жесть)В общем я ничего с интернета не скачивала в последнее время. На компе никаких левых пр…
            n
            nkly3 января 2025 г. 12:52
            Нужно запретить перемещение только некоторых итемов, остальные перемещать можно. Вопрос решен. Узнать QModelIndex элемента на который мы перетаскиваем другой элемент, можно с помощью функции indexAt(event->position().toPoint()) представления QTreeViev вызываемой в переопр…
            M
            Marsel17 августа 2023 г. 0:26
            OAuth2.0 через VK, получение email Спасибо большое за помощь и простите за то что отнял время своей невнимательностью.

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