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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Как создать Окно QWidget дочернее от CWnd или другого ???  (Прочитано 11252 раз)
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) Непонимающий

Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #1 : Март 01, 2011, 13:47 »

Создаешь QWidget c 0-вым родителем, а потом уже встраиваешь созданное окно в имеющееся средствами WinAPI:
SetParent( QWidget::winId(), parent_window );
Записан

Qt 5.11/4.8.7 (X11/Win)
0x0001
Гость
« Ответ #2 : Март 01, 2011, 13:52 »

спасибо , разобрался!!!
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #3 : Март 01, 2011, 14:12 »

Если будут сложности, можно посмотреть Qt/MFC Migration Framework,
правда его писали под Qt3.
Записан

Qt 5.11/4.8.7 (X11/Win)
0x0001
Гость
« Ответ #4 : Март 01, 2011, 15:04 »

да, сложности есть в очередях сообщений, думаю, понятно что они там делают....
конечно, ::SetParent() лишь 10% от общего объёма работы.
Записан
0x0001
Гость
« Ответ #5 : Март 01, 2011, 16:59 »

Проблема. когда использую API функцию SetParent( , ),

Qt-ие контролы начали странно работать с Мышью, например :
 - QButton - не нажимается Кнопка ( хотя наведение указателя мыши - подсвечиавет )
 - QTreeView , не выбирается Мышью элемент , только  Клавиатурой
 - QEdit , не двигается Мышью курсор, только Клавиатурой
и т.д.

Что может быть Непонимающий
« Последнее редактирование: Март 01, 2011, 17:06 от 0x0001 » Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3258


Просмотр профиля
« Ответ #6 : Март 01, 2011, 17:16 »

Я не в теме, но вы в курсе, что в кьюте хэндл окна создается только для топ левел виджета?
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #7 : Март 01, 2011, 17:17 »

Используй QtWinMigrate. По ссылке всё самоё свежее.

Цитата: Авварон
Я не в теме, но вы в курсе, что в кьюте хэндл окна создается только для топ левел виджета?
У него проблема не с хэндлами, а с обработкой событий, т.к. простым SetParent() не заставить работать всю систему обработки Qt-ишных событий.
« Последнее редактирование: Март 01, 2011, 17:22 от GreatSnake » Записан

Qt 5.11/4.8.7 (X11/Win)
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3258


Просмотр профиля
« Ответ #8 : Март 01, 2011, 17:42 »

ну я так понял что из-за сет парента перестают правильно доходить события, тк хэндлов нет, не? кьют же должна преобразовать виндовый эвент в свое представление
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #9 : Март 01, 2011, 17:48 »

Цитировать
ну я так понял что из-за сет парента перестают правильно доходить события, тк хэндлов нет, не? кьют же должна преобразовать виндовый эвент в свое представление
Хендлы есть, иначе как бы репарент отработал? Проблема в том, что после репарента Qt не знает, что этот виджет уже не топ-левел.
Вот чтобы не было всех этих проблем, нужно использовать QtWinMigrate и не использовать WinAPI::SetParent(), из-за которого у Qt малость крышу снесло.

Виноват, сам посоветовал автору изначально неправильное решение. Грустный
Записан

Qt 5.11/4.8.7 (X11/Win)
0x0001
Гость
« Ответ #10 : Март 01, 2011, 17:50 »

Я не в теме, но вы в курсе, что в кьюте хэндл окна создается только для топ левел виджета?
Да, я это давно обнаружил по Spy++ Подмигивающий
Записан
0x0001
Гость
« Ответ #11 : Март 01, 2011, 17:52 »

Цитировать
ну я так понял что из-за сет парента перестают правильно доходить события, тк хэндлов нет, не? кьют же должна преобразовать виндовый эвент в свое представление
Хендлы есть, иначе как бы репарент отработал? Проблема в том, что после репарента Qt не знает, что этот виджет уже не топ-левел.
Вот чтобы не было всех этих проблем, нужно использовать QtWinMigrate и не использовать WinAPI::SetParent(), из-за которого у Qt малость крышу снесло.
Виноват, сам посоветовал автору изначально неправильное решение. Грустный

Совершенно верно в частности, Qt Механизм Connect (,,,,) не работает,
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3258


Просмотр профиля
« Ответ #12 : Март 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.
Проблема что все виджеты алиен в винде.
« Последнее редактирование: Март 01, 2011, 18:21 от Авварон » Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #13 : Март 01, 2011, 18:23 »

Цитировать
нету хэндлов, что вы мне гоните:) под вин и х11 не используются родные структуры, только под мак (и то это уберут), хэндл будет только для окна верхнего.
Речь идёт про то, что в нашем случае они есть, т.к. рождали QWidget без родителя и после успешно делали репарент.
« Последнее редактирование: Март 01, 2011, 18:25 от GreatSnake » Записан

Qt 5.11/4.8.7 (X11/Win)
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3258


Просмотр профиля
« Ответ #14 : Март 01, 2011, 18:31 »

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


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