R
RJMҚаз. 8, 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 Т.Ж.

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

            Пікірлер

            Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
            Кіріңіз немесе Тіркеліңіз
            OI
            • Ora Iro
            • Жел. 24, 2024, 2:38 Т.Қ.

            C++ - Тест 001. Первая программа и типы данных

            • Нәтиже:40ұпай,
            • Бағалау ұпайлары-8
            AD

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

            • Нәтиже:50ұпай,
            • Бағалау ұпайлары-4
            m
            • molni99
            • Қаз. 26, 2024, 8:37 Т.Ж.

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

            • Нәтиже:80ұпай,
            • Бағалау ұпайлары4
            Соңғы пікірлер
            ИМ
            Игорь МаксимовҚар. 22, 2024, 7:51 Т.Қ.
            Django - Оқулық 017. Теңшелген Django кіру беті Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
            Evgenii Legotckoi
            Evgenii LegotckoiҚаз. 31, 2024, 9:37 Т.Қ.
            Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
            A
            ALO1ZEҚаз. 19, 2024, 3:19 Т.Қ.
            Qt Creator көмегімен fb3 файл оқу құралы Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
            ИМ
            Игорь МаксимовҚаз. 5, 2024, 2:51 Т.Қ.
            Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
            d
            dblas5Шілде 5, 2024, 6:02 Т.Қ.
            QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
            Енді форумда талқылаңыз
            p
            pimacontrols85Жел. 31, 2024, 5:39 Т.Қ.
            Finding the Right Rittal Small Enclosure for Your Needs Rittal is a leading manufacturer of enclosures for industrial and IT applications. Their small enclosures offer a compact and reliable solution for a wide range of needs, from housing electronic…
            Donald Randolph
            Donald RandolphЖел. 30, 2024, 10:59 Т.Ж.
            Personal Injury lawyer Santa Monica As an experienced Santa Monica personal injury lawyer, Donald C. Randolph has recovered over $100 Million in verdicts and settlements for our clients. In severe injury cases, this compensation i…
            Nirvana Yoga School
            Nirvana Yoga SchoolЖел. 30, 2024, 1:13 Т.Қ.
            OAuth2.0 через VK, получение email Nirvana Yoga School is one of the most trusted and reputed traditional Rishikesh yoga courses , India certified by Yoga Alliance, USA. We aim to spread traditional yoga teachings so t…
            s
            sriparkЖел. 30, 2024, 12:47 Т.Қ.
            Mobile app development company in Chennai A Mobile app development company in Chennai focuses on creating personalized mobile applications to meet various business requirements. These companies offer a full range of services,…
            a
            amit88Жел. 30, 2024, 12:45 Т.Қ.
            Excel in Exams with PSLE Maths Tuition Singapore Preparing for the PSLE can be challenging, but the right guidance makes all the difference. PSLE Maths tuition Singapore offers personalized coaching to help students master key concepts, improv…

            Бізді әлеуметтік желілерде бақылаңыз