Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Bolonat от Август 04, 2017, 12:30



Название: Как вызвать виджет из dll
Отправлено: Bolonat от Август 04, 2017, 12:30
Здравствуйте!
Работаю в Qt Creator 4.3.1, на Qt 5.9.1 Использую компилятор  MinGW 5.3 (Windows10 64x).
Мне нужно при нажатии кнопки в основном приложении вызвать виджет из dll.
Создала dll. Ниже привожу экспортируемый класс Test. Если конструктор класса оставить пустым, то при нажатии на кнопку появляется ошибка: QWidget: Must construct a QApplication before a QWidget.  А если в конструкторе класса создаю объект QApplication, то при компиляции dll появляется ошибка: invalid use of incomplete type 'class QApplication.
Если в dll нельзя создавать QApplication, то как правильно вызвать виджет из dll? Примеры в сети в основном сделаны на Q4 и предлагают создать QApplication.

Код:
#ifndef TEST_H
#define TEST_H

#include "test_global.h"

class TESTSHARED_EXPORT Test
{

public:
    Test();
    ~Test();
    void pr();
};

#endif // TEST_H

Код:
#include "test.h"
#include "window.h"

QApplication* pApp = NULL;

Test::Test()
{
        int argc=0;
        char *argv[1];
        argv[0]="";
        pApp = new QApplication(argc, argv); //здесь ошибка: invalid use of incomplete type 'class QApplication
}
Test::~Test()
{
   delete pApp;
}

void Test::pr() //Метод который вызывается при нажатии кнопки в основном приложении
{
    Window w;// Это мой виджет
    w.show();
}

Вызов в  основном приложении:
Код:
void MainWindow::on_pushButton_2_clicked()
{
      Test t;
      t.pr();
}


Название: Re: Как вызвать виджет из dll
Отправлено: __Heaven__ от Август 04, 2017, 16:40
Насчёт как сделать это правильно - не знаю. Но от ошибки, скорее всего, поможет #include <QApplication>


Название: Re: Как вызвать виджет из dll
Отправлено: Bepec от Август 04, 2017, 19:10
https://qtsimple.blogspot.ru/2013/10/dll-noqt.html

Моё давнее исследование на эту тему :D


Название: Re: Как вызвать виджет из dll
Отправлено: Bolonat от Август 04, 2017, 19:11
Точно! И если изменить pr():

Код:
void Test::pr() //Метод который вызывается при нажатии кнопки в основном приложении
{
    Window w;
    w.show();
    pApp->exec();
}

То все работает! Спасибо огромное!


Название: Re: Как вызвать виджет из dll
Отправлено: Bolonat от Август 04, 2017, 19:49
Спасибо за исследование! Правда, оно не совсем для новичков... Я вот не совсем поняла, зачем для создания файла в dll создавать отдельный поток и в нем QCoreApplication? Я думала QCoreApplication нужен для того, чтобы отлавливать события, а здесь никаких событий вроде не ожидается...


Название: Re: Как вызвать виджет из dll
Отправлено: Bepec от Август 06, 2017, 12:37
Ну, тема там немного отличается, а QCoreApplication создаётся для того же, для чего вы создаёте QApplication - для работы сигнал слотовых-соединений, и как следствие - нормальной работы виджетов в куче :)


Название: Re: Как вызвать виджет из dll
Отправлено: Igors от Август 07, 2017, 07:11
Если конструктор класса оставить пустым, то при нажатии на кнопку появляется ошибка: QWidget: Must construct a QApplication before a QWidget
Ну так и создайте QApplication в основном приложении


Название: Re: Как вызвать виджет из dll
Отправлено: Bepec от Август 07, 2017, 13:14
Вопрос в том, есть ли в основном приложении Qt :D


Название: Re: Как вызвать виджет из dll
Отправлено: Bolonat от Август 09, 2017, 07:40
Да, решение явно неверное. При попытке запустить dll под отладчиком получаю ошибку: ASSERT failure in QCoreApplication: "there should be only one application object". Подобное описано и здесь (http://www.qtcentre.org/archive/index.php/t-9403.html). Если в dll передавать QApplication, то тогда непонятно зачем вообще создавать dll. :(


Название: Re: Как вызвать виджет из dll
Отправлено: Igors от Август 09, 2017, 07:47
Если в dll передавать QApplication, то тогда непонятно зачем вообще создавать dll. :(
Причин может быть много. Какие-то трудности/приключения возможны если главное приложение НЕ использует Qt, иначе проблем вообще нет