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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Создание библиотеки dll c GUI на Qt.  (Прочитано 13529 раз)
HirurG.
Гость
« : Декабрь 09, 2013, 15:43 »

Здравствуйте! У меня возникла задача переделать приложение, написанное с помощью Qt в библиотеку dll, которую можно было бы использовать в другом (не использующем Qt) проекте.
Другими словами, у меня есть класс, унаследованный от QWidget с интерфейсом приложения и некоторыми рабочими свойствами и  методами. Разработка ведётся в Microsoft Visual Studio 2010 + Qt Add-In (Qt 4.8.3).  Мастер создания Qt Library создаёт код, но я не совсем понимаю как с ним работать дальше и куда "прилепить" мой QWidget, чтобы потом можно было использовать его методы из экспортируемых функций.
Если кто-то сталкивался с похожей задачей и знает возможные пути решения буду признателен за подсказки.

P.S. не уверен насчёт правильного выбора раздела, но наверное это всё-таки относится к GUI
Записан
Bepec
Гость
« Ответ #1 : Декабрь 09, 2013, 20:39 »

Поищи по форуме 2-4 темы уже было, одну создавал я. Там и примеры есть.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Декабрь 09, 2013, 20:56 »

но я не совсем понимаю как с ним работать дальше и куда "прилепить" мой QWidget, чтобы потом можно было использовать его методы из экспортируемых функций.
Да никуда в "не Qt приложении" т.к. использование QWidget предполагает наличие запущенного QApplication, которого нет в хосте без Qt.

Поищи по форуме 2-4 темы уже было, одну создавал я. Там и примеры есть.
Аккуратнее, юноша, не вводите человека в заблуждение  Улыбающийся

Сам сейчас сращиваю "не Qt приложение" с "Qt окнами/диалогами", были позывы даже написать статейку - но здравый смысл победил  Улыбающийся
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #3 : Декабрь 09, 2013, 21:30 »

Да никуда в "не Qt приложении" т.к. использование QWidget предполагает наличие запущенного QApplication, которого нет в хосте без Qt.
А в чем проблема создать экземпляр QApplication?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Декабрь 09, 2013, 21:41 »

А в чем проблема создать экземпляр QApplication?
Во многом

1)  Иметь возможность модифицировать хост
2)  Отследить чтобы экземпляр не изгадил меню - ну спасибо есть флаг macPlugin - но он не все решает
3) Синхронизировать события - капитальный геморрой

Хотя все это порешал - мечтаю когда текущая работа закончится, и смогу сделать хост нормальным Qt приложением
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #5 : Декабрь 09, 2013, 21:47 »

Во многом
А ну да, вы как всегда ваш частный случай обобщили на всех. Улыбающийся

1)  Иметь возможность модифицировать хост
Это не обязательно.

2)  Отследить чтобы экземпляр не изгадил меню - ну спасибо есть флаг macPlugin - но он не все решает
В каком смысле "экземпляр не изгадил меню"? Экземпляр чего может изгадить меню и до какой степени?

3) Синхронизировать события - капитальный геморрой
Синхронизировать между чем и чем?
« Последнее редактирование: Декабрь 09, 2013, 22:18 от Old » Записан
Bepec
Гость
« Ответ #6 : Декабрь 09, 2013, 22:11 »

Igors что вы ответите на работоспособную dll в не Qt приложении? Я зря что ли тут просиживал полмесяца и она у меня не работает, а так - притворяется? Веселый
Записан
HirurG.
Гость
« Ответ #7 : Декабрь 10, 2013, 08:49 »

спасибо за отклики! в поиске нашёл только вот этот (http://www.prog.org.ru/index.php?topic=24492.msg174106;topicseen) вариант. попытался реализовать его у себя - не компилится. может быть кто-нибудь поможет собрать минимальный работающий пример, чтобы можно было его дальше допиливать?
во вложении прикрепил свой "велосипед"
Записан
Johnik
Крякер
****
Offline Offline

Сообщений: 339


Просмотр профиля
« Ответ #8 : Декабрь 10, 2013, 10:26 »

Цитировать
не компилится
что выдает?

Код:
private:
    Ui::SimpleWidgetDLL *ui;

это где описано?
Записан
HirurG.
Гость
« Ответ #9 : Декабрь 10, 2013, 10:34 »

Цитировать
не компилится
что выдает?
кучу всего выдаёт:
Ошибка   3   error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию   d:\projects\qt\examples\simplewidgetdll\simplewidgetdll\simplewidgetdll.h   17
Ошибка   17   error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию   d:\projects\qt\examples\simplewidgetdll\simplewidgetdll\simplewidgetdll.h   17
Ошибка   12   error C2653: QDialog: не является именем класса или пространства имен   d:\projects\qt\examples\simplewidgetdll\simplewidgetdll\simplewidgetdll.h   30
Ошибка   13   error C2653: QDialog: не является именем класса или пространства имен   d:\projects\qt\examples\simplewidgetdll\simplewidgetdll\simplewidgetdll.h   35
Ошибка   26   error C2653: QDialog: не является именем класса или пространства имен   d:\projects\qt\examples\simplewidgetdll\simplewidgetdll\simplewidgetdll.h   30
Ошибка   27   error C2653: QDialog: не является именем класса или пространства имен   d:\projects\qt\examples\simplewidgetdll\simplewidgetdll\simplewidgetdll.h   35
Ошибка   1   error C2504: QDialog: не определен базовый класс   d:\projects\qt\examples\simplewidgetdll\simplewidgetdll\simplewidgetdll.h   12
Ошибка   15   error C2504: QDialog: не определен базовый класс   d:\projects\qt\examples\simplewidgetdll\simplewidgetdll\simplewidgetdll.h   12
Ошибка   10   error C2228: выражение слева от ".size" должно представлять класс, структуру или объединение   d:\projects\qt\examples\simplewidgetdll\simplewidgetdll\simplewidgetdll.h   25
Ошибка   24   error C2228: выражение слева от ".size" должно представлять класс, структуру или объединение   d:\projects\qt\examples\simplewidgetdll\simplewidgetdll\simplewidgetdll.h   25
Ошибка   2   error C2143: синтаксическая ошибка: отсутствие ";" перед "public"   d:\projects\qt\examples\simplewidgetdll\simplewidgetdll\simplewidgetdll.h   17
Ошибка   16   error C2143: синтаксическая ошибка: отсутствие ";" перед "public"   d:\projects\qt\examples\simplewidgetdll\simplewidgetdll\simplewidgetdll.h   17
Ошибка   5   error C2065: QList: необъявленный идентификатор   d:\projects\qt\examples\simplewidgetdll\simplewidgetdll\simplewidgetdll.h   23
Ошибка   19   error C2065: QList: необъявленный идентификатор   d:\projects\qt\examples\simplewidgetdll\simplewidgetdll\simplewidgetdll.h   23
Ошибка   7   error C2065: l: необъявленный идентификатор   d:\projects\qt\examples\simplewidgetdll\simplewidgetdll\simplewidgetdll.h   24
Ошибка   9   error C2065: l: необъявленный идентификатор   d:\projects\qt\examples\simplewidgetdll\simplewidgetdll\simplewidgetdll.h   25
Ошибка   21   error C2065: l: необъявленный идентификатор   d:\projects\qt\examples\simplewidgetdll\simplewidgetdll\simplewidgetdll.h   24
Ошибка   23   error C2065: l: необъявленный идентификатор   d:\projects\qt\examples\simplewidgetdll\simplewidgetdll\simplewidgetdll.h   25
Ошибка   11   error C2065: endl: необъявленный идентификатор   d:\projects\qt\examples\simplewidgetdll\simplewidgetdll\simplewidgetdll.h   25
Ошибка   25   error C2065: endl: необъявленный идентификатор   d:\projects\qt\examples\simplewidgetdll\simplewidgetdll\simplewidgetdll.h   25
Ошибка   8   error C2065: cout: необъявленный идентификатор   d:\projects\qt\examples\simplewidgetdll\simplewidgetdll\simplewidgetdll.h   25
Ошибка   22   error C2065: cout: необъявленный идентификатор   d:\projects\qt\examples\simplewidgetdll\simplewidgetdll\simplewidgetdll.h   25
Ошибка   6   error C2062: тип "int" не требуется   d:\projects\qt\examples\simplewidgetdll\simplewidgetdll\simplewidgetdll.h   23
Ошибка   20   error C2062: тип "int" не требуется   d:\projects\qt\examples\simplewidgetdll\simplewidgetdll\simplewidgetdll.h   23
Ошибка   4   error C2061: синтаксическая ошибка: идентификатор "QWidget"   d:\projects\qt\examples\simplewidgetdll\simplewidgetdll\simplewidgetdll.h   18
Ошибка   18   error C2061: синтаксическая ошибка: идентификатор "QWidget"   d:\projects\qt\examples\simplewidgetdll\simplewidgetdll\simplewidgetdll.h   18
Ошибка   14   error C1189: #error :  "The header file 'simplewidgetdll.h' doesn't include <QObject>."   D:\projects\Qt\Examples\SimpleWidgetDLL\SimpleWidgetDLL\GeneratedFiles\Debug\moc_simplewidgetdll.cpp   12
Ошибка   28   error C1083: Не удается открыть файл включение: QApplication: No such file or directory   D:\projects\Qt\Examples\SimpleWidgetDLL\SimpleWidgetDLL\simplewidgetdll.cpp   2


Цитировать
Код:
private:
    Ui::SimpleWidgetDLL *ui;
это где описано?
не совсем понял вопроса. я писал по аналогии с примером по ссылке выше, там было
Код:
private:
    Ui::Editor *ui;
Записан
Johnik
Крякер
****
Offline Offline

Сообщений: 339


Просмотр профиля
« Ответ #10 : Декабрь 10, 2013, 10:40 »

Код:
private:
    Ui::SimpleWidgetDLL *ui;
такой код как правило генерирует QtDesigner, предполагаю, что интерфейс в примере, за основу который вы взяли, нарисован именно в designer'е

Цитировать
кучу всего выдаёт:
не пробовали сами ошибки исправлять? они элементарные, не включен файл, например...
Записан
HirurG.
Гость
« Ответ #11 : Декабрь 10, 2013, 10:47 »

Цитировать
не пробовали сами ошибки исправлять? они элементарные, не включен файл, например...
конечно пробовал, но даже при добавлении #include <qDialog> начинает ругаться на эту строчку. Я не могу понять, почему qDialog.h не находится и возникает мысль, что я ошибся где-то раньше, но не знаю где.
Записан
HirurG.
Гость
« Ответ #12 : Декабрь 10, 2013, 11:09 »

В общем почистил проект. Стало немного яснее, но всё равно компилятор ругается на заголовок функции
Код:
extern "C" WindowInterface* SIMPLEWIDGETDLL_EXPORT createInterface()
{
    int argc = 0;
    char **argv = 0;
    if(QApplication::instance() == 0)
        new QApplication(argc, argv);
 
    return new SimpleWidget;
}
пишет
error C2059: синтаксическая ошибка: __declspec(dllexport)   D:\projects\Qt\Examples\SimpleWidgetDLL\SimpleWidgetDLL\SimpleWidget.cpp   4

я думаю надо прописать прототип функции в заголовочный файл, но пока не справляюсь  Улыбающийся может кто что умное посоветовать?
Записан
Johnik
Крякер
****
Offline Offline

Сообщений: 339


Просмотр профиля
« Ответ #13 : Декабрь 10, 2013, 11:30 »

заменить (SimpleWidget.h):
Код:
extern "C" WindowInterface* SIMPLEWIDGETDLL_EXPORT createInterface();
на
Код:
extern "C" SIMPLEWIDGETDLL_EXPORT WindowInterface* createInterface();

заменить (SimpleWidget.cpp):
Код:
WindowInterface* SIMPLEWIDGETDLL_EXPORT createInterface()
на
Код:
WindowInterface* createInterface()
Записан
HirurG.
Гость
« Ответ #14 : Декабрь 10, 2013, 11:38 »

заменить (SimpleWidget.h):
Код:
extern "C" WindowInterface* SIMPLEWIDGETDLL_EXPORT createInterface();
на
Код:
extern "C" SIMPLEWIDGETDLL_EXPORT WindowInterface* createInterface();

заменить (SimpleWidget.cpp):
Код:
WindowInterface* SIMPLEWIDGETDLL_EXPORT createInterface()
на
Код:
WindowInterface* createInterface()
спасибо! но теперь сыпет кучу ошибок "ссылка на неразрешённый внешний символ..." в файлах SimpeWidjet.obj и moc_SimpeWidjet.obj
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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