Qt小部件与顶部的QML混合

Qt小部件与顶部的QML混合,qt,widget,overlay,qml,Qt,Widget,Overlay,Qml,我想使用两个小部件(一次一个)作为我的应用程序的基础/背景,上面有一个QML UI和一个无边界窗口。应该是这样的: 基于OpenGL的扫描组件 通过窗口句柄操作的三维可视化组件 几个QML UI组件作为覆盖(可能是可拖动的) QML边栏组件 我已经成功地将组件1包含到QGLWidget中,并在其顶部显示QML组件。工作没有问题 但是,我无法使组件2正常工作。如果我将它包含到顶级QWidget中,并使用其winId访问句柄,我就可以轻松地完成它。不幸的是,我不能在此基础上再接再厉。我考虑了几个选

我想使用两个小部件(一次一个)作为我的应用程序的基础/背景,上面有一个QML UI和一个无边界窗口。应该是这样的:

  • 基于OpenGL的扫描组件
  • 通过窗口句柄操作的三维可视化组件
  • 几个QML UI组件作为覆盖(可能是可拖动的)
  • QML边栏组件
  • 我已经成功地将组件1包含到QGLWidget中,并在其顶部显示QML组件。工作没有问题

    但是,我无法使组件2正常工作。如果我将它包含到顶级QWidget中,并使用其
    winId
    访问句柄,我就可以轻松地完成它。不幸的是,我不能在此基础上再接再厉。我考虑了几个选项,但似乎没有一个是足够的:

    • 如果我使用QWidget,组件位于顶部,QML组件无法覆盖
    • 我试图让它与QGraphicsProxy小部件一起工作,但它只显示一个空的灰色小部件
    • 我了解到新的(er)方法是使用基于QWidget的应用程序,并使用QtQuick2进行覆盖。但同样,它似乎只适用于基于OpenGL的组件
    • Qt5.3和Qt5.4中可能也有使用QQuickWidget和QOpenGLWidget的选项,但我不知道它是如何工作的,也不知道它是否工作,因为我没有看到符合我目的的示例
    • 还可以选择
      QWidget::createWindowContainer
      ,但不允许(透明)覆盖
    我的问题是,我不知道如何用QML覆盖非GL小部件,然后在以后如何将所有内容包含到一个应用程序中(在两个小部件之间切换时,
    setViewport
    可能存在父问题)。有没有人这样做过,或者可以指出一个可能显示结果的方向

    我正在使用Qt5.2.1、VS2012和针对x64的构建(要求),目标是Windows桌面


    当然,有一个高性能的解决方案是很好的,可能是基于QtQuick2的,但我很困惑,我会接受任何至少能让它暂时工作的东西。

    最后,我使用了一个QWindow,使用它的窗口手柄来集成3D可视化,然后用QQuickView组件覆盖它(以QWindow作为父窗口)。该解决方案的唯一缺点是它不允许透明。

    只需使用QQuickWidget-它基本上是一个可以放置QML的小部件。您必须将Qt版本更新到至少5.3,5.4最终版本昨天发布。我刚下载完5.3.2,将尽快试用。我已经尽了最大努力,但我无法获得我的许可证t运行。我找到了一个Qt开发人员的“qquickviewcomparison”,它看起来是正确的。但是,它只是表明您可以在OpenGL/QML场景上覆盖FBO。我需要QML在绑定到第三方可视化的非OpenGL小部件上。此外,QQuickWidget文档明确告诉您“避免调用winId()在QQuickWidget上。此函数触发本机窗口的创建,导致性能降低,并可能出现渲染故障“。但我需要winId来集成非OpenGL小部件。我真的很想知道,为什么显然没有完善的解决方案来解决这个问题,因为这是UI框架的一个相当常见的过程。似乎它们只针对OpenGL世界。对我来说真是太糟糕了……试试
    QQuickRenderControl
    类-它允许在屏幕外渲染QtQuickn缓冲区,您可以将其用作纹理,放置在任何您想要的位置。