dll и GUI |
Здравствуйте, гость ( Вход | Регистрация )
dll и GUI |
Гость_Евгений_* |
28.11.2008, 1:23
Сообщение
#1
|
Гости |
Всем доброго времени суток.
Я несколько лет писал разные проги с использованием MFC. и сейчас в качестве познавания нового решил переписать один проект на QT. Поставил QT версии 4.4.0, пересобрал статически под vs2005. все компилится, линкуется, ок. Возник следующий вопрос. Вообще QT позволяет внутри динамических библиотек создавать ГУИ? Или нет? У меня есть гланое окно (которое наследуется от QMainWindow). На него кладу дерево и таб через сплиттер. В дерево помещаются грубо говоря названия библиотек, подключаемых к программе. А в табы передаются указатели на классы, реализованные в dll, производные от QDialog. Так вот, в библиотеке есть экспортируемая функция, при вызове которой создается класс, в конструкторе которого создаются объекты диалоговых окон. Затем указатели на эти объекты передаются в главное приложение и кладутся в QTabWidget. (это по задумке). На деле ни хрена не работает. При попытке создать экземпляр диалогового окна в dll вылетает ошибка что qpaintDevice или как то так должен быть создан до QApplication. Вобщем, если перед созданием моего диалоговго окна создать экземпляр QApplication (хотя мне не понятно чем он будет отличаться от того, который реализован в функции main в главном приложении и зачем его создавать еще раз), то все путем (на время). Т.е. диалоговое окно вроде как создается, а когда я его уже в главном приложении пытаюсь добавить в качестве дочернего виджета в сплиттер, вылетает ошибка что нельзя добавлять виджеты, созданные в разных потоках. Вот это чесгря вообще не понятно, как это так... Поток я не создаю, библиотека вроде как должна грузиться в адресное пространство главного приложения. Такие ограничения как-то непонятны.... Вроде все хвалят qt, а неужели он такого не позволяет? Уважаемые эксперты, поделитесь пожалуйста тонкостями, как такое реализовать? Имеется еще одна неясность: В винде если писать dll средствами winAPI, надо объявлять функцию DllMain, которая вызывается при загрузке библиотеки.... А в случае работы с QT? Как тут? Есть 2 книжки, но как-то там стороной обходится этот вопрос.... Пробовал просто main писать, но она не вызывается ни разу. Может сигнатура должна быть другая? Или имя? Вобщем основной вопрос у меня такой, можно ли при использовании qt писать плагины, содержащие ГУИ? При этом ГУИ такие, что основное приложения естесственно ничего и не знает о плагинах? но при этом его окно является родителем окнам, созданным в плагинах? Заранее большое спасибо за ответы! |
|
|
ViGOur |
28.11.2008, 10:37
Сообщение
#2
|
Мастер Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: 40 |
Читайте: GUI внутри динамической библиотеки, Как засунуть модальное окно внутрь DLL?, я там пример выкладывал в качестве аттача...
|
|
|
Litkevich Yuriy |
29.11.2008, 7:47
Сообщение
#3
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
|
|
|
Гость_Евгений_* |
29.11.2008, 22:55
Сообщение
#4
|
Гости |
ViGOur
Прочитал эту тему. Удалось создать в dll свое окошко. К сожалению есть одно но. Это окошко не может быть добавлено к QTabWidget посредством addWidget. Пишет что типа созданы в разных потокакх и пр. Это можно как-то избежать? Т.е. грубо говоря в dll создаются окна, которые затем должны быть добвлены как закладки на главное окно (которое создается в exe). Я в принципе придумал как можно...ну сэмулировать чтоли это. Закладки можно делать со стилем AlwaysOnTop - или как-то так (код на работе остался, не могу посмотреть) и без заголовка. Но тогда другая проблема: перед созданием диалогового окна в dll создаю объект QApplication. Соответственно если вызывать app.exec() в dll, то не происходит отрисовки главного окна (потому что загрузка dll происходит до строки return app.exec(), находящеся в функции main в exe). Если же в dll не писать app.exec(), то главное окно отрисовывается нормально, а вот диалоговые окна созданные в dll - хреново (перерисовка происходит только при наложении других окон и пр. - такие симптомы). Т.е. есть например заполненный combobox, но как я там что-то выбираю, я не вижу - не рисуется синяя полоска . Подскажите плиз, как тут быть? Litkevich Yuriy Ок, спасибо, посмотрю. А там серьезные косяки? У меня на работе 6.5 часов компилился qt... |
|
|
Litkevich Yuriy |
30.11.2008, 6:09
Сообщение
#5
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
А там серьезные косяки? насколько я понял, там появились косяки которых в 4.3.х не было и народ крепко поподал, а вот 4.4.2 исправили все, что ровно работало в 4.3.х . И еще в 4.4.х наблюдаются косяки при статической сборке.Вобщем я рекомендую собрать 4.4.3 с разделяемыми библиотеками и опробывать, а статическую сборку, если сильно приспичит сделать отдельно. |
|
|
Гость_Гость_* |
22.12.2008, 17:37
Сообщение
#6
|
Гости |
Так и сделал... Только вот msvc почему-то не хочет работать с разделяемыми библиотеками.. Т.е. в принципе понятно почему, не понятно как убрать эти тысячи ошибок линковки (((( Не понятно где указать среде, какие dll использовать. Со статическими все просто (#pragma comment(lib, "...")). С динамическими никак не получается... Даже директива #import не помогает. ((( Если кто знает, подскажите плиз, можно ли заставить msvc работать с динамическими библиотеками qt, скомпиленными из не коммерческой версии qt.
Пробовал уже другие среды: KDevelop, CodeBlocks, QDevelop. Ни одна из них к сожалению не нравится в том плане, что практически полностью отсутствует возможность трассировки с просмотром значений переменных.... А без этого никак... Всякие мессаджбоксы выводить... это как-то тупо.... "qDebuq <<" в QDevelop-е делает вывод только после завершения приложения.... к тому же я еще по брейкпоинтам не могу зайти почему-то... с какой-то консоли на вопрос "Использовать ли такой-то брейкпоинт" автоматом отвечается "no". С какой радости? Где сказать "yes"? Короче, сплошные разочарования.... Не говоря уж об автодополнении кода через раз со своими типами данных и полным отсутствием автодополнения для stl например.... Или я чего-то не понимаю... Осталась последняя надежда, настроить msvc на работу с динамическими dll qt. Теряется кроссплатформенность конечно... но зато хоть отладчик нормальный... )) Вобщем наставьте на путь истинный пожалйста, старейшины! Заранее большое пасибо |
|
|
ViGOur |
22.12.2008, 17:51
Сообщение
#7
|
Мастер Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: 40 |
Если версия не комерческая и нет интегратора, то сначала тебе нужно будет создать проект для студии, делается это так:
После чего открываешь студийный проект и пользуешь. Там же можешь посмотреть куда и что прописывается в настройках проекта. Я в принципе делаю Qt Wizard для студии, но пока реализован только визард для консольной версии Qt проекта, GUI и библиотеки пока времени нет добить... Зато Add'in уже может работать с gui версией, но с уже настроенной руками... |
|
|
Rocky |
22.12.2008, 21:18
Сообщение
#8
|
Старейший участник Группа: Участник Сообщений: 530 Регистрация: 22.12.2008 Из: Санкт-Петербург Пользователь №: 463 Спасибо сказали: 22 раз(а) Репутация: 7 |
Только что поставил qt 4.4.3 инсталлятором (т.е. не сам собирал). Попробовал скомпилить один из их примеров:
Получил такой вот вывод..... Может это связано с тем, что готовая QT не сконфигурирована под 2005-ю студию? И ее (QT) надо пересобрать? Да, без указания все работает.
|
|
|
Litkevich Yuriy |
23.12.2008, 5:56
Сообщение
#9
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
Может это связано с тем, что готовая QT не сконфигурирована под 2005-ю студию? да связано, см. тут параграф "Готовые сборки"ViGOur, может найдешь время исправить заготовку статьи Сборка Qt с использованием MS Visual Studio я посути текст скопировал из статьи по сборке с помощью MinGW32, хотел сам всю процедуру проделать и описать в статье. Но времени не нашлось |
|
|
Rocky |
24.12.2008, 0:12
Сообщение
#10
|
Старейший участник Группа: Участник Сообщений: 530 Регистрация: 22.12.2008 Из: Санкт-Петербург Пользователь №: 463 Спасибо сказали: 22 раз(а) Репутация: 7 |
Все, разобрался.... практически. vcapp почему-то не хочет кушать, ну и хрен с ним. Я взял уже готовый проект из их примеров, поменял в нем имена, основные принципы понял. Как сделать чтобы метаобъектные файлы генерились тоже вроде понятно. Правда руками такое тяжело писать... столько ключей всяких.. И это надо не забывать дописывать custom build в каждом файле, в котором определен класс с макросом Q_OBJECT. Да и генерятся они почему-то постоянно, даже если я ничего не изменял (так же, как и генерируется файл из ui постоянно, при каждом запуске приложения из-под среды). Ну это ладно... Основная проблема решилась. msvc2005+shared qt+visual assist. Остановился на таком варианте. По-поводу самого сабжа для тех кто будет читать, если qt собирать не статически, то неважно где что определено. в dll можно создавать любые виджеты, добавлять их в качестве дочерних виджетам, созданным в других dll или exe. Все очень классно работает.
Большое спасибо ViGOur, Litkevich Yuriy! |
|
|
Текстовая версия | Сейчас: 22.12.2024, 13:15 |