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

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

Страниц: [1] 2 3   Вниз
  Печать  
Автор Тема: Вопрос к знатокам Qt и компиляторов  (Прочитано 21440 раз)
nik135
Гость
« : Февраль 16, 2009, 22:55 »

Есть следующая проблема: нужно использовать виджет от qt4 в qt3. Обе библиотеки существуют на машине параллельно и используют каждая свои glibc, g++ и т.д.
Для решения задачи создаю библиотеку  средствами qt4 и в ней же создаю объект QApplication. Потом к этой библиотеке линкуюсь из qt3. Все компилируется, но не пашет :-( Валится в сегфолт  Злой

Подскажите, нормально ли существование двух QApplication?(один из qt3, другой в библиотке qt4)
Ах, да, забыл написать, Linux.

Жду умных мыслей Улыбающийся
Записан
Rain
Гость
« Ответ #1 : Февраль 17, 2009, 00:43 »

Подскажите, нормально ли существование двух QApplication?(один из qt3, другой в библиотке qt4)

А как такое вообще может быть, два QApplication? Event loop ведь запускается...
Записан
ритт
Гость
« Ответ #2 : Февраль 17, 2009, 02:13 »

создавать сущность QApplication в либе - нонсенс.
смешивать библиотеки как бы нежелательно, особенно такие, как кутэ...
Записан
Dendy
Гость
« Ответ #3 : Февраль 17, 2009, 09:12 »

Даже больше - не нежелательно, а невозможно, так как отдельные куски кода будут импортировать классы с одними и теми же именами. Сам не пробовал, но можно попытаться собрать Qt4, завёрнутым в отдельный namespace. И конечно же создавать в библиотеке экземпляр QApplication (если ещё не был создан) и периодически вызывать у него QApplication::processEvents().

А вообще здравый смысл подсказывает писать библиотеки для Qt3-программ на Qt3, а для Qt4 - на Qt4. Как ни печально.

Ещё можно попробовать вынести Qt4-библиотеку в отдельный процесс, если это не противоречит дизайну основной программы.
Записан
shadone
Гость
« Ответ #4 : Февраль 17, 2009, 11:30 »

именно - для одновременной работы Qt 3 и 4 нужно собрать последнюю с указанием namespace.

кстати создание QApplication в плагине это не нонсенс а вполне используемая техника при написании плагинов на Qt4к приложению которое не использует Qt.
Есть конечно нюансы - например QApplication должен создаваться в главное (gui) потоке (по другому может работать но этот usecase не поддерживается).
Записан
ритт
Гость
« Ответ #5 : Февраль 17, 2009, 12:02 »

кстати создание QApplication в плагине это не нонсенс а вполне используемая техника при написании плагинов на Qt4к приложению которое не использует Qt.
нехилый такой плагинчик получится Улыбающийся
а есть конкретные примеры такого использования?
Записан
nik135
Гость
« Ответ #6 : Февраль 17, 2009, 12:48 »

о, кто-то заинтересовался, уже неплохо! создавать либы для 3-ки на 3-ке это конечно хороший совет, но только я до этого мог и сам догадаться(такой вариант не подходит) по поводу qapplication в библиотеке-это для того, чтобы отображался библиотечный виджет и работал событийный механизм. а по поводу неймспейсов- все разнесено и не конфликтует, по крайней мере мне так кажется. а как проверить?
Записан
shadone
Гость
« Ответ #7 : Февраль 17, 2009, 12:50 »

нехилый такой плагинчик получится Улыбающийся
а есть конкретные примеры такого использования?
вроде для продуктов Adobe есть плагины на Qt4, подробнее не скажу.
Записан
BRE
Гость
« Ответ #8 : Февраль 17, 2009, 13:21 »

Плагины они разные бывают.
Вот например, если из библиотеки использующей Qt4 экспортировать следующую функция:
Код
C++ (Qt)
int pluginFunc()
{
   QApplication app(...);
   MyDialog dlg;
   return dlg.exec()
}
 
и использовать ее в приложении использующем Qt3, то проблем особых не будет.
А вот если попробовать сделать что-то подобное:
Код
C++ (Qt)
QTreeView *pluginFinc()
{
   return new QTreeView;
}
 
и попытаться этот виджет встроить в приложение на Qt3, то тут возникает масса вопросов с циклом обработки событий Qt4 (где его запускать? в отдельной ните, не уверен что получиться), его отрисовкой и т.д.
Теперь, помещаем этот TreeView (Qt4) на виджет (Qt3), для него tree будет чужеродным объектом, т.к. это не наследник от QWidget (Qt3), layout manager (Qt3) также не сможет его нормально разместить на parent'е.
Мое мнение, слишком много проблем, а результат .... сомнителен.
« Последнее редактирование: Февраль 17, 2009, 13:41 от BRE » Записан
nik135
Гость
« Ответ #9 : Февраль 17, 2009, 13:48 »

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

Сообщений: 2901



Просмотр профиля WWW
« Ответ #10 : Февраль 17, 2009, 13:54 »

А как насчет отдельного процесса для Qt4 (как уже предложил Dendy)?
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
BRE
Гость
« Ответ #11 : Февраль 17, 2009, 13:57 »

вот примерно первый вариант у меня и не получается заставить работать. в библиотеке - класс и виджет, который взаимодействует с этим классом. никаких возвратов значений и вызовов с параметрами.  только показать форму с виджетами 4-ки.
Эта тема уже поднималась: http://www.prog.org.ru/topic_7223_0.html

И кстати да, камрады Dendy и pastor не зря задают тебе вопрос про отдельный процесс.
После запуска функции из плагина твоя основная программа полностью "замерзнет" пока не произойдет выход из этой функции. Пользователю это поведение  явно не понравиться.
« Последнее редактирование: Февраль 17, 2009, 14:07 от BRE » Записан
nik135
Гость
« Ответ #12 : Февраль 17, 2009, 14:48 »

хм. по ссылке пример под винду и билдер, а здесь линукс и кути. немного не то, не находите? кста, под винду к билдеру я свою либу прикрутил. все работает. вариант с отдельным процессом не нравится тем, что пока данные отдавать не надо, а вдруг понадобится? тогда нужно будет придумывать способ обмена данными между процессами.
Записан
vaprele07
Гость
« Ответ #13 : Февраль 17, 2009, 14:57 »

QX11EmbedWidget?
Записан
BRE
Гость
« Ответ #14 : Февраль 17, 2009, 15:25 »

хм. по ссылке пример под винду и билдер, а здесь линукс и кути. немного не то, не находите?
А какая разница?
Там написано как написать функцию для разделяемой библиотеки, которую можно вызывать из любой программы (даже не использующей Qt).
Записан
Страниц: [1] 2 3   Вверх
  Печать  
 
Перейти в:  


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