Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: 0x0001 от Март 01, 2011, 13:30



Название: Как создать Окно 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-шных обработчиков.