Russian Qt Forum

Qt => Общие вопросы => Тема начата: mal от Август 21, 2008, 16:06



Название: Qt 4.4.1: использование HWND в качестве parent'а
Отправлено: mal от Август 21, 2008, 16:06
Бен это Данила! Ай нид хелп!
*
Задачка : сделал гуёвую (qt) dll. Снаружи ее зовет виндовое приложение, которое  передает хэндл  (HWND) окна, в котором требуется разместить мое приложение.
Вопрос - как это сделать? Т.е. как задать виджету в качестве парента виндовое окно?

Порылся в местных архивах и нашел упоминание про класс QWinHost. Дальше уже у тролей почитал как это делалось (QWinWidget ) в Qt 3.3.3 (
http://doc.trolltech.com/solutions/qtwinmigrate/ ).
В 4-й Qt ничего подобного не нашел :-( .

Варианты типа пусть дэлелина отработает в своем отдельном окне увы не проходят.
Есть идеи?


Название: Re: Qt 4.4.1: использование HWND в качестве parent'а
Отправлено: mal от Август 21, 2008, 16:22
порылся еще немного у тролей и нашел, что механизм таки есть, но видимо за отдельные деньги
http://trolltech.com/products/qt/addons/catalog/4/Windows/qtwinmigrate/

существует ли альтернатива?


Название: Re: Qt 4.4.1: использование HWND в качестве parent'а
Отправлено: lex_newton от Август 21, 2008, 21:41
Покури в сторону SetParent (Win API)


Название: Re: Qt 4.4.1: использование HWND в качестве parent'а
Отправлено: Alex03 от Август 22, 2008, 07:38
Данила-Лёша это Бэн, два дня назад тема была:
http://prog.org.ru/forum/topic_7591_0.html

Но ИМХО это извращение... Модальное окно ещё куда ни шло, а вставка Qt widget-ов в чужое екно....


Название: Re: Qt 4.4.1: использование HWND в качестве parent'а
Отправлено: Tonal от Август 22, 2008, 11:13
А чем плохо?
Если окно не должно быть модальное а приложение написано на MFC/VCL
У того же TC есть же плагины браузеры, например...


Название: Re: Qt 4.4.1: использование HWND в качестве parent'а
Отправлено: Alex03 от Август 22, 2008, 13:57
А чем плохо?
Если окно не должно быть модальное а приложение написано на MFC/VCL

Не модальное (топ левел) это одно, а "которое передает хэндл  (HWND) окна, в котором требуется разместить мое приложение." уже другое. Начиная с проблемами геометрией/ресайзами/использованием лэйаутов и т.д. Потом отрисовка, возможно различное изображение одних и тех же элементов в базовом приложении и плагине.
Но главная проблема на мой взгляд в различных циклах обработки сообщений, он ведь при этом работает родной MFC/VCL (и пр.), конечно всякие стандартные сообщения (WM_CLOSE, WM_MOUSE_MOVE или как оно там? и т.д.) будут передаваться в WndProc Qt-окна. Но во внутренностях Qt-шного цикла есть ещё много чего, таймеры/idle (хотя допускаю что оно через WM_TIMER), queuedConnection для сигнал/слотов (тоже возможно через какойнить WM_USER+N), сеть (QSocketNotifier) и т.д.
Допускаю что сейчас это всё через виндовую очередь всё идёт (в коде копалься некогда), но где гарантия на будущее?
Всё это ИМХО, у меня нет Qt/MFC Migration Framework, поэтому не могу судить как оно там сделано, хотя очень интересно. :) Мож я сильно заблуждаюсь и не всё так печально. Впрочем у меня пока и такой задачи не стояло. :)

Цитировать
У того же TC есть же плагины браузеры, например...
Не знаю что такое TC. :) Да и плагины всякие бывают, для отдельных окон можно и отдельный тред/процесс породить.

Tonal Всё это моё мнение, ни в коей мере не хочу спорить, скорее наоборот - разобраться как на самом деле, да и плохо/хорошо - понятия относительные, понятно что порой по другому никак и приходится извращаться.


Название: Re: Qt 4.4.1: использование HWND в качестве parent'а
Отправлено: mal от Август 22, 2008, 14:38
Шура видел я эту тему ога, после  того как сию создал .
Если задачу так ставят, что я могу поделать...

покурил в сторону SetParent:

значит если мы пытаемся покласть QMainWindow (передаем указательв конструктор, там же делаем SetParent ) на HWND - то ничего не выходит, в смысле что окно наше кутовое создается само по себе, а не внутри HWND.
То же самое происходит и с QFrame - ему в title переносится название парента, но окно создается само по себе, также вне парента. Т.е. имеем парент и вторым окном QFrame.
Таким образом мы имеем два окна  - одно например win32 приложения, и второе

Больше пробовать не стал, ибо это не есть требуемое решение. Потому, что мне требуется расположить кутовый виджет внутри виндового окна, а не породить отудельно кутовое окно.

ЗЫ Курю в сторону QtWinMigrate ;-)