Russian Qt Forum
Ноябрь 24, 2024, 04:14 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как вызвать виджет из dll  (Прочитано 6353 раз)
Bolonat
Чайник
*
Offline Offline

Сообщений: 56


Qt Creator 4.5.0 на Qt 5.10.0 (W10 x64) MinGW 5.3.


Просмотр профиля
« : Август 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();
}
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #1 : Август 04, 2017, 16:40 »

Насчёт как сделать это правильно - не знаю. Но от ошибки, скорее всего, поможет #include <QApplication>
Записан
Bepec
Гость
« Ответ #2 : Август 04, 2017, 19:10 »

https://qtsimple.blogspot.ru/2013/10/dll-noqt.html

Моё давнее исследование на эту тему Веселый
Записан
Bolonat
Чайник
*
Offline Offline

Сообщений: 56


Qt Creator 4.5.0 на Qt 5.10.0 (W10 x64) MinGW 5.3.


Просмотр профиля
« Ответ #3 : Август 04, 2017, 19:11 »

Точно! И если изменить pr():

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

То все работает! Спасибо огромное!
Записан
Bolonat
Чайник
*
Offline Offline

Сообщений: 56


Qt Creator 4.5.0 на Qt 5.10.0 (W10 x64) MinGW 5.3.


Просмотр профиля
« Ответ #4 : Август 04, 2017, 19:49 »

Спасибо за исследование! Правда, оно не совсем для новичков... Я вот не совсем поняла, зачем для создания файла в dll создавать отдельный поток и в нем QCoreApplication? Я думала QCoreApplication нужен для того, чтобы отлавливать события, а здесь никаких событий вроде не ожидается...
Записан
Bepec
Гость
« Ответ #5 : Август 06, 2017, 12:37 »

Ну, тема там немного отличается, а QCoreApplication создаётся для того же, для чего вы создаёте QApplication - для работы сигнал слотовых-соединений, и как следствие - нормальной работы виджетов в куче Улыбающийся
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Август 07, 2017, 07:11 »

Если конструктор класса оставить пустым, то при нажатии на кнопку появляется ошибка: QWidget: Must construct a QApplication before a QWidget
Ну так и создайте QApplication в основном приложении
Записан
Bepec
Гость
« Ответ #7 : Август 07, 2017, 13:14 »

Вопрос в том, есть ли в основном приложении Qt Веселый
Записан
Bolonat
Чайник
*
Offline Offline

Сообщений: 56


Qt Creator 4.5.0 на Qt 5.10.0 (W10 x64) MinGW 5.3.


Просмотр профиля
« Ответ #8 : Август 09, 2017, 07:40 »

Да, решение явно неверное. При попытке запустить dll под отладчиком получаю ошибку: ASSERT failure in QCoreApplication: "there should be only one application object". Подобное описано и здесь. Если в dll передавать QApplication, то тогда непонятно зачем вообще создавать dll. Грустный
« Последнее редактирование: Август 16, 2017, 08:03 от Bolonat » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #9 : Август 09, 2017, 07:47 »

Если в dll передавать QApplication, то тогда непонятно зачем вообще создавать dll. Грустный
Причин может быть много. Какие-то трудности/приключения возможны если главное приложение НЕ использует Qt, иначе проблем вообще нет
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.247 секунд. Запросов: 22.