5

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

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

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

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

谢谢

4

3 回答 3

7

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

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

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

于 2018-10-02T15:35:09.113 回答
0

如果有人偶然发现这个问题并且正在寻找没有Qt3DWindowand的解决方案,我在这里createWindowContainer实现了一个 Qt3DWidget 。它渲染到屏幕外纹理,并在. 最小的干扰和开销。QOpenGLWidget

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

于 2020-11-11T17:24:23.087 回答
-1

您正在寻找的 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
                        }
                    }
                }
            }
        ]
    }
}
于 2016-05-30T14:56:47.150 回答