在QApplication MainWindow

时间:2016-05-22 20:24:51

标签: c++ qt widget qt3d

我开始在Qt。 我正在尝试在QApplication的MainWindow上从Qt3d渲染3D视图。

我发现的示例都是基于QGuiApplications而没有使用Qt Quick和QML的小部件,但我的目标是使用小部件,因为这将是一个桌面应用程序。

我在我的MainWindow UI表单中使用了Qt设计器,在中央窗口小部件上,我使用了Vertical布局在左侧放置了选项卡,在右侧使用了具有扩展水平尺寸策略的空窗口小部件。我的目标是创建一个基于现有Qt类的Class,它将支持Qt3d,同时还能够处理小部件。然后从Mainwindow表单中我想将Widget推广到该类。

我已经尝试过QWindow,但它不允许使用小部件,我想使用QGlview来访问小部件?我真的不想弄乱opengl并且现在不推荐使用它了吗?有人可以指导我一个实现这个的例子吗?

谢谢

3 个答案:

答案 0 :(得分:2)

如果要使用QWidget,那么最简单的方法是创建一个Qt3DWindow并使用createWindowContainer将其转换为QWidget。您可以像其他任何返回控件一样使用返回的QWidget(将其添加到布局或其他任何控件中)。

Qt3DExtras::Qt3DWindow *view = new Qt3DExtras::Qt3DWindow();
QWidget *container = QWidget::createWindowContainer(view);

这种方法的唯一问题是使用Qt Designer并不是那么简单。我倾向于只在Qt Designer中使用占位符QWidget,然后在MainWindow构造函数中使用类似于上面的代码来创建所需的QWidget,并替换我的占位符或将此新的窗口小部件放入占位符小部件中

答案 1 :(得分:0)

您正在寻找的QML项目称为Scene3D:

http://doc.qt.io/qt-5/qt3d-scene3d-example.html

import QtQuick.Scene3D 2.0

Scene3D {
    id: scene3d
    anchors.fill: parent
    Entity {
        Camera {
            id: camera
            projectionType: CameraLens.PerspectiveProjection
            fieldOfView: 45
            aspectRatio: scene3d.width/scene3d.height
            nearPlane : 0.1
            farPlane : 1000.0
            position: Qt.vector3d( 0.0, 0.0, -40.0 )
            upVector: Qt.vector3d( 0.0, 1.0, 0.0 )
            viewCenter: Qt.vector3d( 0.0, 0.0, 0.0 )
        }
        Entity {
            components: [
                SphereMesh {},
                PhongMaterial {}
            ]
        }
        components: [
            FrameGraph {
                activeFrameGraph: Viewport {
                    rect: Qt.rect(0.0, 0.0, 1.0, 1.0)
                    clearColor: "transparent"
                    CameraSelector {
                        camera: camera
                        ClearBuffer {
                            buffers : ClearBuffer.ColorDepthBuffer
                        }
                    }
                }
            }
        ]
    }
}

答案 2 :(得分:0)

如果有人偶然发现了这个问题,并且正在寻找没有Qt3DWindowcreateWindowContainer的解决方案,那么我实现了一个Qt3DWidget here。它呈现为屏幕外纹理,并在QOpenGLWidget中的四边形上使用该纹理。干扰和开销最小。只有鼠标事件无法完全正常工作(将鼠标悬停在QObjectPicker上还不能正常工作,只有当您单击并拖动鼠标时才可以)。

我需要这样的小部件,因为我有一个程序,您可以在其中拖动3D视图,然后createWindowContainer始终将所包含的子项绘制在所有内容之上。