Политика конфиденциальностиКонтактыО сайтеОтзывыGitHubDonate
© EVILEG 2015-2018
Рекомендует хостинг
TIMEWEB
R
8 октября 2018 г. 13: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 со своим циклом, в котором все варится и все должно быть нормально. Толком ничего по этому вопросу не нашел. Прошу помочь, заранее спасибо =)

6
R
  • 8 октября 2018 г. 13: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
Это ничего не дало, ошибки те же. 


0

Добрый день!

Во первых 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 файла библиотеки. То есть поулчается отеносительный путь.





0
R
  • 8 октября 2018 г. 14: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 не совсем понял как обойтись.



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

0

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

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

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

0

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
НБ
15 февраля 2019 г. 13:09
Николай Булахтин

C++ - Тест 003. Условия и циклы

  • Результат:50баллов,
  • Очки рейтинга-4
НБ
15 февраля 2019 г. 13:03
Николай Булахтин

C++ - Тест 002. Константы

  • Результат:25баллов,
  • Очки рейтинга-10
НБ
15 февраля 2019 г. 13:01
Николай Булахтин

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

  • Результат:73баллов,
  • Очки рейтинга1
Последние комментарии
V
14 февраля 2019 г. 18:41
Vlad15007

Спасибо огромное! Заработало!
А
12 февраля 2019 г. 9:26
Александр90

Сам разборался, спасибо.
А
12 февраля 2019 г. 8:19
Александр90

День добрый! Можешь выложить форму mainwindow.ui от урока? Заранее спасибо
11 февраля 2019 г. 10:51
Евгений Легоцкой

Нет, у меня проблема с жёстким диском случилась, занимался восстановлением ПК, ещё пару вечеров придётся этим заниматься, увы.
Сейчас обсуждают на форуме
15 февраля 2019 г. 21:22
IscanderChe

Доброй ночи.Скромно напоминаю о своём вопросе...
15 февраля 2019 г. 15:36
Евгений Легоцкой

Ну я тут нашёл одно решение, но сам его не проверял. Вам нужно помещать фамилии скорее всего в ячейки заголовка, и потом просто перерисовывать их QHeaderView * header = m_ui->tableWidget...
15 февраля 2019 г. 7:53
Евгений Легоцкой

Добрый день! Не работал с remoteobjects, поэтому глянул документацию, чтобы рассмотреть, что это за зверь. После просмотра документации сложилось стойкой впечатление, что это вполне возм...
m
14 февраля 2019 г. 18:28
mr_roman

Нашел решение на Java. Удалось интегрировать в проект сервиса на Qt, теперь из Qt запускаю Java-код акселерометра.
14 февраля 2019 г. 11:00
Евгений Легоцкой

ok. I see. You changed related name Try this {% if goal.joined.all|user_in:request.user %}
Присоединяйтесь к нам в социальных сетях

Для зарегистрированных пользователей на сайте присутствует минимальное количество рекламы