【问题标题】:Qt QML component like WPF HwndHostQt QML 组件,如 WPF HwndHost
【发布时间】:2015-04-29 21:16:22
【问题描述】:

我们有一个桌面 Windows 应用程序,它使用一个需要显示 HWND 的组件。在 WPF 应用程序中,我们使用 HwndHost 来显示它。我们正在尝试制作一个基于 Qt QML 的应用程序来做同样的事情。

是否可以在 QML 应用程序中托管 HWND 组件?

它适用于QQuickWindow,但我附加的控件占用了整个窗口应用程序区域。我想绑定到一个较小的区域,比如下面 QML 中的rectArea。但是QQuickItem 没有windId(),只有它的父window()。有可能吗?
这是我的 QML:

ApplicationWindow {
  width: 640
  height: 480
  visible: true
  Rectangle {
    objectName: "rectArea"
    id: rectangle1
    x: 0
    y: 0
    width: 200
    height: 200
    color: "#ffffff"
 }
}

这里是一个 cpp sn-p:

void setHwnd(QQmlApplicationEngine& m_engine) {
  auto root_objects = m_engine.rootObjects();
  m_rootObject = root_objects[0];
  auto rect_area = m_rootObject->findChild<QQuickItem*>("rectArea");
  HWND hWnd = reinterpret_cast<HWND>(rect_area->window()->winId());
  // use hWnd here, but it takes the entire window area...
}

【问题讨论】:

  • 这是一个有趣的问题。您能告诉我们您最终是如何解决的吗?

标签: wpf windows qt qml hwnd


【解决方案1】:

一旦你有了一个QWindow(或任何继承自它的东西),你就可以通过调用winId 方法来获得HWND。您需要像这样进行类型转换:

QWindow pWindow;
// create pWindow
HWND hWnd = reinterpret_cast<HWND>(pWindow->winId());

【讨论】:

    【解决方案2】:

    Rectangle 没有自己的HWND。您只能检索整个窗口的HWND。您必须将自己限制在矩形范围内,例如托管 OpenGL 应用程序时:

     glViewport(x(), windowHeight - y() - height(), width(), height());
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多