1 / 1 / 0
Регистрация: 19.08.2015
Сообщений: 26

Gui на qt в виде dll

07.12.2016, 16:41. Показов 3049. Ответов 5
Метки dll, gui, qt (Все метки)

Студворк — интернет-сервис помощи студентам
Возникла проблема такого плана: есть приложение работающее вообще без gui, было решено что к нему нужно запилить этот самый пользовательский интерфейс. Пытаюсь это сделать создав интерфейс, а гуишный класс написанный на qt и реализующий этот интерфейс запихать в dll. Но вот тут самое интересное....а как его запустить? Ведь если выполнить QApplication::exec(), то он будет бесконечно в нем крутиться и не давать выполниться остальному коду, а если не вызывать exec(), то изменения не будут отображаться в окне gui. Как быть?

хедер с интерфейсом
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
struct MyInterface {
    virtual int Add(int a, int b) = 0;
    virtual void Print() = 0;
};
 
extern "C" bool __declspec(dllexport) GetMyInterface(MyInterface** pMyInterface);
typedef bool(*GETINTF)(MyInterface** pMyInterface);
 
extern "C" bool __declspec(dllexport) FreeMyInterface(MyInterface** pMyInterface);
typedef bool(*FREEINTF)(MyInterface** pMyInterface);
реализация функций создания объекта
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
bool GetMyInterface(MyInterface** pMyInterface) {
    if (!*pMyInterface) {
        *pMyInterface = new Gui(0);
        return true;
    }
    return false;
}
 
bool FreeMyInterface(MyInterface** pMyInterface) {
    if (!*pMyInterface) {
        return false;
    }
    delete *pMyInterface;
    pMyInterface = 0;
    app.exit();
    return true;
}
хедер Gui
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Gui : public QObject, public MyInterface
{
    Q_OBJECT
 
public:
    Gui(QObject *parent);
    ~Gui();
 
public slots:
    int Add(int a, int b);
    void Print();
 
private:
    int argc;
    char** argv;
    //QApplication app;
    QTextEdit* textEdit;
};
реализация gui
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Gui::Gui(QObject *parent)
    : QObject(parent), argc(0), argv(0)//, app(argc, argv)
{
    this->textEdit = new QTextEdit;
    this->textEdit->show();
 
    this->textEdit->append("I'm QT and I'm alive");
    //app.exec();
}
 
int Gui::Add(int a, int b) {
    this->textEdit->append("You check Add function");
    return a + b;
}
 
void Gui::Print() {
    this->textEdit->append("I'm QT and I can print everything");
}
здесь пытаюсь все это дело подключить и использовать
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
int main()
{
    HINSTANCE hDll = LoadLibrary("Library.dll");
 
    MyInterface* myInterface = 0;
 
    if (hDll) {
        std::cout << "Dll load - successful" << std::endl;
 
        GETINTF GetMyInterface;
        GetMyInterface = (GETINTF)GetProcAddress(hDll, "GetMyInterface");
        if (!GetMyInterface) {
            std::cout << "Load F GetMyInterface - fail" << std::endl;
            FreeLibrary(hDll);
            _getch();
            return 0;
        }
 
        FREEINTF FreeMyInterface;
        FreeMyInterface = (FREEINTF)GetProcAddress(hDll, "FreeMyInterface");
        if (!FreeMyInterface) {
            std::cout << "Load F FreeMyInterface - fail" << std::endl;
            FreeLibrary(hDll);
            _getch();
            return 0;
        }
 
        GetMyInterface(&myInterface);
 
        std::cout << "My interface print - " << myInterface->Add(10, 5)<<std::endl;
        myInterface->Print();
 
        _getch();
 
        FreeMyInterface(&myInterface);
 
        std::cout << Add(2, 3) << std::endl;
        Print("a");
        PrintWSC("a");
 
    }
    else {
        std::cout << "Not load dll" << std::endl;
    }
    _getch();
    return 0;
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
07.12.2016, 16:41
Ответы с готовыми решениями:

GUI и DLL
Здравствуйте. Qt 5.0.1 Можно ли в dll создавать и(или) показывать какие либо виджеты? Вот так не работает: #include...

Gui средствами dll
Вопрос стар как мир, но конкретного решения нет( не на стеке, ни где либо еще, везде пишут размыто, что можно но много косяков, не давая...

Вызов функции в dll из формы или из GUI
Приветствую. Есть форма, в ней объявлены 3 функции из длл. При старте формы происходит вызов одной из функций, при завершении - второй....

5
1443 / 1326 / 131
Регистрация: 20.03.2009
Сообщений: 4,689
Записей в блоге: 11
07.12.2016, 18:11
Цитата Сообщение от МаксМалафеев Посмотреть сообщение
Как быть?
Все переделать.
0
1 / 1 / 0
Регистрация: 19.08.2015
Сообщений: 26
07.12.2016, 21:36  [ТС]
просто цены нет такому ответу
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
07.12.2016, 22:33
Ну а какой ответ ты хочешь? Не будет это работать. Не может приложение находится в dll. Сделай нормальное с окном и перенеси туда твоё древнее, в слот кнопки вставь, например.
0
1443 / 1326 / 131
Регистрация: 20.03.2009
Сообщений: 4,689
Записей в блоге: 11
08.12.2016, 11:02
Qt использует событийно-ориентированную модель для работы нужен цикл обработки событий(EventLoop).
Если архитектурно не было предусмотрен eventloop, то нужно менять архитектуру.
0
1 / 1 / 0
Регистрация: 19.08.2015
Сообщений: 26
09.12.2016, 09:03  [ТС]
Короче говоря проблема решается достаточно просто, в win32 приложении нужно было вызвать функцию создания Гпи(в которой к слову создаётся и QApplication) в отдельном потоке - вот и все решение...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.12.2016, 09:03
Помогаю со студенческими работами здесь

GUI приложение на Qt. Всегда ли нужно таскать с собой dll файлы?
Создал простое GUI приложение с помощью Qt. Но одного exe файла не хватает, приходится добавлять в папку с .exe файлом релиза...

как к GUI-проекту на qt creatore подключить dll сделанную в MSVS2010 и вызывать из нее функции?
Сделал проект типа калькулятора на 3 текстовых полях(2 числа и результат)+ 4 кнопки(+-*/)... в длл прописаны функции(сложение и.т.п) каким...

Как запустить qt gui программу, как демон, без gui, скрыв gui?
Как запустить qt gui программу, как демон, без gui, скрыв gui? В gui браузер выполняет определенные действия, и нужно запустить этот...

Com в виде dll
// Client.cpp: определяет точку входа для консольного приложения. // #include &quot;stdafx.h&quot; #include &lt;windows.h&gt; #include...

Создание внутреннего COM в виде dll
Ребят, помогите добить проект, я только учусь, не обессудьте... Создаю простое COM приложение в виде dll, вроде все по инструкции, но в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

Новые блоги и статьи
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru