Политика конфиденциальностиКонтактыО сайтеОтзывы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

Ответы

Только авторизованные пользователи могут отвечать на форуме.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
ДД
13 декабря 2018 г. 16:24
Дмитрий Дубовик

C++ - Тест 005. Структуры и Классы

  • Результат:66баллов,
  • Очки рейтинга-1
13 декабря 2018 г. 16:04
Metelev

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

  • Результат:47баллов,
  • Очки рейтинга-6
YC
12 декабря 2018 г. 18:49
Yaroslav Chernetskyi

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

  • Результат:31баллов,
  • Очки рейтинга-10
Последние комментарии
V
15 декабря 2018 г. 2:06
Vlad15007

Спасибо большое!Очень помогли!
11 декабря 2018 г. 21:01
Евгений Легоцкой

Не знаю, какой-там конкретно эффект и если честно не хочется fl studio ради того, чтобы посмотреть устанавливать, но из того, что увидел в интернете. Предполагаю, что то, что вы хотите с...
V
11 декабря 2018 г. 19:25
Vlad15007

Подскажите пожалуйста ( я новичок совсем)Можно ли организовать спрайт без этого окошка (как в fl studio fruity dance)?
11 декабря 2018 г. 15:06
Евгений Легоцкой

Что интересно, если написать так from <application_name>.<module_name> import <filename> ,то PyCharm сносит крышу, если разрабатываешь в рамках проекта приложение, ко...
11 декабря 2018 г. 14:52
Илья Чичак

Тут мне тоже есть что сказать=) Сами разрабы советуют импортировать следующим образом: from <application_name> import <module_name> Стоит избегать from . import &l...;
Сейчас обсуждают на форуме
ИМ
18 декабря 2018 г. 15:29
Игорь Максимов

Доброго времени суток. Имеется модель для видео-контента (Movie), а конкретно привязана сейчас к одной модели(Compilation). Появилась необходимость добавить еще одну модель (Category) и связа...
R
18 декабря 2018 г. 12:25
RED_Spider

именно так, проблема в кодировке, а именно в отсутствии шрифтов на сервере, для меня вопрос решился в CentOS 7yum install curl cabextract xorg-x11-font-utils fontconfig всем спасибо за ...
U
18 декабря 2018 г. 10:39
Unreal_man

А вот этот коннект здесь и вовсе не нужен connect(ui->ok3, &QPushButton::clicked, this, &Widget::addToText); А как же без него? ============================== ...
m
17 декабря 2018 г. 19:03
melnik10

Спасибо, попробую!
R
16 декабря 2018 г. 14:41
RED_Spider

перевірено все працює http://doc.qt.io/qt-5/appicon.html Setting the Application Icon on Windows First, create an ICO format bitmap file that contains the icon image. This ca...
Присоединяйтесь к нам в социальных сетях

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