我开始在Qt。 我正在尝试在QApplication的MainWindow上从Qt3d渲染3D视图。
我发现的示例都是基于QGuiApplications而没有使用Qt Quick和QML的小部件,但我的目标是使用小部件,因为这将是一个桌面应用程序。
我在我的MainWindow UI表单中使用了Qt设计器,在中央窗口小部件上,我使用了Vertical布局在左侧放置了选项卡,在右侧使用了具有扩展水平尺寸策略的空窗口小部件。我的目标是创建一个基于现有Qt类的Class,它将支持Qt3d,同时还能够处理小部件。然后从Mainwindow表单中我想将Widget推广到该类。
我已经尝试过QWindow,但它不允许使用小部件,我想使用QGlview来访问小部件?我真的不想弄乱opengl并且现在不推荐使用它了吗?有人可以指导我一个实现这个的例子吗?
谢谢
答案 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)
如果有人偶然发现了这个问题,并且正在寻找没有Qt3DWindow
和createWindowContainer
的解决方案,那么我实现了一个Qt3DWidget here。它呈现为屏幕外纹理,并在QOpenGLWidget
中的四边形上使用该纹理。干扰和开销最小。只有鼠标事件无法完全正常工作(将鼠标悬停在QObjectPicker
上还不能正常工作,只有当您单击并拖动鼠标时才可以)。
我需要这样的小部件,因为我有一个程序,您可以在其中拖动3D视图,然后createWindowContainer
始终将所包含的子项绘制在所有内容之上。