Le composant Qt QML comme WPF HwndHost

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());