Nous avons une application Windows de bureau qui utilise un composant qui nécessite l’affichage d’un HWND
. Dans une application WPF, nous utilisons un HwndHost
pour l’afficher. Nous essayons de faire une application basée sur Qt QML pour faire la même chose.
Est-il possible d’héberger un composant HWND
dans une application QML?
Il fonctionne avec un QQuickWindow
, mais le contrôle que je connecte prend tout le domaine d’application de la fenêtre. Je voudrais lier à une zone plus petite, comme le rectArea
dans le QML ci-dessous. Mais un QQuickItem
n’a pas de windId()
, seulement sa window()
parente window()
. C’est possible?
Voici mon QML:
ApplicationWindow { width: 640 height: 480 visible: true Rectangle { objectName: "rectArea" id: rectangle1 x: 0 y: 0 width: 200 height: 200 color: "#ffffff" } }
Et voici un extrait de cpp:
void setHwnd(QQmlApplicationEngine& m_engine) { auto root_objects = m_engine.rootObjects(); m_rootObject = root_objects[0]; auto rect_area = m_rootObject->findChild("rectArea"); HWND hWnd = reinterpret_cast(rect_area->window()->winId()); // use hWnd here, but it takes the entire window area... }
Une fois que vous avez une QWindow (ou tout ce qui en hérite), vous pouvez obtenir HWND en appelant la méthode winId
. Vous devrez le convertir comme ceci:
QWindow pWindow; // create pWindow HWND hWnd = reinterpret_cast(pWindow->winId());
Un Rectangle
n’a pas son propre HWND
. Vous ne pouvez récupérer le HWND
pour toute la fenêtre. Vous devez vous limiter au rectangle, par exemple lorsque vous hébergez une application OpenGL:
glViewport(x(), windowHeight - y() - height(), width(), height());