Название: Как создать Окно QWidget дочернее от CWnd или другого ??? Отправлено: 0x0001 от Март 01, 2011, 13:30 Моё почтение всем.
(OS - Windows, VS2008, использую Qt4 & MFC в одном проекте) 2. есть класс окна CWnd (MFC) (соответственно в нём HWND m_hWnd - ID окна в системе) 3. есть класс окна QWidget (Qt4) (соответственно в нём HWND winId() - ID окна в системе) как сделать QWidget окно дочернее от CWnd (т.е. от HWND m_hWnd) ??? Название: Re: Как создать Окно QWidget дочернее от CWnd или другого ??? Отправлено: GreatSnake от Март 01, 2011, 13:47 Создаешь QWidget c 0-вым родителем, а потом уже встраиваешь созданное окно в имеющееся средствами WinAPI:
SetParent( QWidget::winId(), parent_window ); Название: Re: Как создать Окно QWidget дочернее от CWnd или другого ??? Отправлено: 0x0001 от Март 01, 2011, 13:52 спасибо , разобрался!!!
Название: Re: Как создать Окно QWidget дочернее от CWnd или другого ??? Отправлено: GreatSnake от Март 01, 2011, 14:12 Если будут сложности, можно посмотреть Qt/MFC Migration Framework (http://doc.trolltech.com/solutions/qtwinmigrate/index.html),
правда его писали под Qt3. Название: Re: Как создать Окно QWidget дочернее от CWnd или другого ??? Отправлено: 0x0001 от Март 01, 2011, 15:04 да, сложности есть в очередях сообщений, думаю, понятно что они там делают....
конечно, ::SetParent() лишь 10% от общего объёма работы. Название: Re: Как создать Окно QWidget дочернее от CWnd или другого ??? Отправлено: 0x0001 от Март 01, 2011, 16:59 Проблема. когда использую API функцию SetParent( , ),
Qt-ие контролы начали странно работать с Мышью, например : - QButton - не нажимается Кнопка ( хотя наведение указателя мыши - подсвечиавет ) - QTreeView , не выбирается Мышью элемент , только Клавиатурой - QEdit , не двигается Мышью курсор, только Клавиатурой и т.д. Что может быть ??? Название: Re: Как создать Окно QWidget дочернее от CWnd или другого ??? Отправлено: Авварон от Март 01, 2011, 17:16 Я не в теме, но вы в курсе, что в кьюте хэндл окна создается только для топ левел виджета?
Название: Re: Как создать Окно QWidget дочернее от CWnd или другого ??? Отправлено: GreatSnake от Март 01, 2011, 17:17 Используй QtWinMigrate (http://qt.gitorious.org/qt-solutions/qt-solutions/trees/master/qtwinmigrate). По ссылке всё самоё свежее.
Цитата: Авварон Я не в теме, но вы в курсе, что в кьюте хэндл окна создается только для топ левел виджета? У него проблема не с хэндлами, а с обработкой событий, т.к. простым SetParent() не заставить работать всю систему обработки Qt-ишных событий. Название: Re: Как создать Окно QWidget дочернее от CWnd или другого ??? Отправлено: Авварон от Март 01, 2011, 17:42 ну я так понял что из-за сет парента перестают правильно доходить события, тк хэндлов нет, не? кьют же должна преобразовать виндовый эвент в свое представление
Название: Re: Как создать Окно QWidget дочернее от CWnd или другого ??? Отправлено: GreatSnake от Март 01, 2011, 17:48 Цитировать ну я так понял что из-за сет парента перестают правильно доходить события, тк хэндлов нет, не? кьют же должна преобразовать виндовый эвент в свое представление Хендлы есть, иначе как бы репарент отработал? Проблема в том, что после репарента Qt не знает, что этот виджет уже не топ-левел.Вот чтобы не было всех этих проблем, нужно использовать QtWinMigrate и не использовать WinAPI::SetParent(), из-за которого у Qt малость крышу снесло. Виноват, сам посоветовал автору изначально неправильное решение. :( Название: Re: Как создать Окно QWidget дочернее от CWnd или другого ??? Отправлено: 0x0001 от Март 01, 2011, 17:50 Я не в теме, но вы в курсе, что в кьюте хэндл окна создается только для топ левел виджета? Да, я это давно обнаружил по Spy++ ;)Название: Re: Как создать Окно QWidget дочернее от CWnd или другого ??? Отправлено: 0x0001 от Март 01, 2011, 17:52 Цитировать ну я так понял что из-за сет парента перестают правильно доходить события, тк хэндлов нет, не? кьют же должна преобразовать виндовый эвент в свое представление Хендлы есть, иначе как бы репарент отработал? Проблема в том, что после репарента Qt не знает, что этот виджет уже не топ-левел.Вот чтобы не было всех этих проблем, нужно использовать QtWinMigrate и не использовать WinAPI::SetParent(), из-за которого у Qt малость крышу снесло. Виноват, сам посоветовал автору изначально неправильное решение. :( Совершенно верно в частности, Qt Механизм Connect (,,,,) не работает, Название: Re: Как создать Окно QWidget дочернее от CWnd или другого ??? Отправлено: Авварон от Март 01, 2011, 18:19 нету хэндлов, что вы мне гоните:) под вин и х11 не используются родные структуры, только под мак (и то это уберут), хэндл будет только для окна верхнего.
Код: f a widget is non-native (alien) and winId() is invoked on it, that widget will be provided a native handle. Название: Re: Как создать Окно QWidget дочернее от CWnd или другого ??? Отправлено: GreatSnake от Март 01, 2011, 18:23 Цитировать нету хэндлов, что вы мне гоните:) под вин и х11 не используются родные структуры, только под мак (и то это уберут), хэндл будет только для окна верхнего. Речь идёт про то, что в нашем случае они есть, т.к. рождали QWidget без родителя и после успешно делали репарент.Название: Re: Как создать Окно QWidget дочернее от CWnd или другого ??? Отправлено: Авварон от Март 01, 2011, 18:31 а, не так прочел, извиняюсь. А куда в итоге приходит эвент? Почему кьют его не обрабатывает корректно?
Название: Re: Как создать Окно QWidget дочернее от CWnd или другого ??? Отправлено: 0x0001 от Март 01, 2011, 18:44 Используй QtWinMigrate (http://qt.gitorious.org/qt-solutions/qt-solutions/trees/master/qtwinmigrate). По ссылке всё самоё свежее. СПАСИБО!!! Всё очень просто и всё заработало! Законы Вселенной да будут Благосклонны к тебе.... Название: Re: Как создать Окно QWidget дочернее от CWnd или другого ??? Отправлено: 0x0001 от Март 01, 2011, 18:45 а, не так прочел, извиняюсь. А куда в итоге приходит эвент? Почему кьют его не обрабатывает корректно? Да, действительно, почему ????Название: Re: Как создать Окно QWidget дочернее от CWnd или другого ??? Отправлено: GreatSnake от Март 01, 2011, 21:27 Цитировать А куда в итоге приходит эвент? Почему кьют его не обрабатывает корректно? В итоге все мышиные и клавиатурные события приходят в новое не Qt топ-левел окно и не доходят до Qt-шных обработчиков. |