Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: anymouse от Сентябрь 24, 2005, 19:14



Название: Как разместить QWidget внутри HWND?
Отправлено: anymouse от Сентябрь 24, 2005, 19:14
QT - 3.2.3, платформа -  Win32

Задача - есть обычное окно, не QWidget, есть его HWND. Надо разместить виджет внутри этого окна. Т.е. надо сделать виджет child'ом не QWidget'а, а WId.

У класса QWidget есть метод create, который получает в параметрах WId и по идее создает объект QWidget на основе уже созданного окна, этот объект мог бы стать родителем. Но этот create вызывается только в конструкторе с пустыми параметрами.

Подскажите, если кто знает, как это можно сделать?


Название: Как разместить QWidget внутри HWND?
Отправлено: MoonRover от Сентябрь 25, 2005, 13:35
этого нельзя сделать средствами самого qt.
может какие-то нездоровые пляски с бубном и помогут, но не стоит.
QWidget может быть потомком только QWidget ;)


Название: Как разместить QWidget внутри HWND?
Отправлено: anymouse от Сентябрь 25, 2005, 17:55
жаль, видно придется использовать MFC :(


Название: Как разместить QWidget внутри HWND?
Отправлено: zlatko от Сентябрь 28, 2005, 11:49
я себе не представляю задачи которая решается средствами тупого мфс
и не может быть решена з кт. Может роскажеш про свои глобальние цели?


Название: Как разместить QWidget внутри HWND?
Отправлено: anymouse от Сентябрь 28, 2005, 21:52
Цитата: "zlatko"
я себе не представляю задачи которая решается средствами тупого мфс и не может быть решена з кт. Может роскажеш про свои глобальние цели?

С удовольствием :)
Делаю что-то вроде плагина - приложение создает окно и передает его дескриптор (HWND (win) == WId (qt) ) плагину. Плагин размещает на этом окне всякие свои дочерние окна.
C MFC все просто - оно умеет создавать объект CWnd (CWnd::FromHandle) на основе HWND, указываешь потом полученный объект в качестве родителя и вперед.
QWidget же можно создать только на QWidget'е. Также я не нашел аналога MFC'шному FromHandle, чтобы создать объект QWidget, привязанный к существующему WId.
Есть, правда, у QWidget'а защищенный метод create, который в параметрах получает WId, и если он !=0, новое окно не создается, а используется указанное. Но он вызывается в конструкторе с пустыми параметрами, т.е. всегда создается новое окно.

P.S. создавать окно плагином не вариант, надо разместить содержимое именно в предоставленном окне.

P.P.S. у меня Qt 3.2.3


Название: Как разместить QWidget внутри HWND?
Отправлено: anymouse от Сентябрь 28, 2005, 21:54
вот еще не знаю, можно ли в виндос сделать одно окно потомком другого (разместить его в клиентской области родителя) после создания окна? Если можно, проблема решилась бы, но пока не получилось.


Название: Как разместить QWidget внутри HWND?
Отправлено: Garrett от Октябрь 05, 2005, 15:17
Не пробовал поиграться с чистым WinAPI?
Код:

HWND SetParent(
          HWND hWndChild,
          HWND hWndNewParent
          );

В качестве Child передать WId, а parent - твой HWND. Пробовать лень, но вроде должно сработать


Название: Как разместить QWidget внутри HWND?
Отправлено: Antoxa1985 от Октябрь 05, 2005, 15:43
Цитировать
CWnd (CWnd::FromHandle)
QWidget * QWidget::find ( WId id ) ???


Название: Как разместить QWidget внутри HWND?
Отправлено: anymouse от Октябрь 13, 2005, 19:19
Цитировать

HWND SetParent(
          HWND hWndChild,
          HWND hWndNewParent
          );
Цитировать

с этого начал, не прошло :(

Цитировать

QWidget * QWidget::find ( WId id )

она ищет только среди созданных виджетов, т.е. не создает новый класс (как у МФСи), а возвращает указатель на существующий

Здесь, на сколько я понял, еще проблемы с QApplication, только с моделью кютишного приложения я уже не стал ковыряться


Название: Как разместить QWidget внутри HWND?
Отправлено: Sergeich от Октябрь 13, 2005, 21:01
твои проблемы должен решить класс QWinWidget из Qt Solution'a Qt/MFC Migration Framework  ( см. http://doc.trolltech.com/solutions/3/qtwinmigrate/qwinwidget.html ). Залить Qt Solutions  можно с сайта Racheangel'a