我正在尝试使用菜单,状态栏等向现有QMainWindow添加3D视图。我知道有两种方法可以达到这个目的:
选项1不起作用,我在下面有以下代码
class View3D(QWidget):
def __init__(self):
self.view = Qt3DWindow()
self.createWindowContainer(self.view);
# put some nodes in the scene
scene = createScene()
# Camera
camera = self.view.camera()
camera.lens().setPerspectiveProjection(45.0, 16.0 / 9.0, 0.1, 1000.0)
camera.setPosition(QVector3D(0.0, 0.0, 40.0))
camera.setViewCenter(QVector3D(0.0, 0.0, 0.0))
# For camera controls.
camController = QFirstPersonCameraController(scene)
camController.setLinearSpeed(50.0)
camController.setLookSpeed(180.0)
camController.setCamera(camera)
# assign root node to the view
view.setRootEntity(scene)
然后将此View3D小部件添加到QMainWindow的布局中。由于某种原因,它失败并出现错误“RuntimeError:Qt3DWindow类型的包装C / C ++对象已被删除”。
我的猜测是PyQt只跟踪一个主窗口,当创建Qt3DWindow时,QMainWindow被释放,程序崩溃。
此外,这种方法感觉有点黑客,在窗口内添加一个窗口。我觉得这不是可行的方法。
选项2适用于我,但现在我无法访问Qt3DWindow.camera()
或Qt3DWindow.setRootEntity()
等高级功能。
相反,所有在线教程都显示您可以使用QGLWidget绘制三角形,但不进一步使用/重新实现高级界面和场景图。
据我了解,PyQt5官方示例中也没有证明这一点。 basicshapes-py.py
示例是我想要实现的最接近的事情,但它似乎为Qt3DWindow添加了一些按钮,这对我来说不好,因为我需要一个QMainWindow作为基类。
因此,将3D视图集成到基于QWidget的UI的推荐方法是什么?
来自@ G.M。
的评论后的新代码class View3D(QWidget):
def __init__(self):
super().__init__()
self.view = Qt3DWindow()
self.container = self.createWindowContainer(self.view);
vboxlayout = QHBoxLayout()
vboxlayout.addWidget(self.container)
self.setLayout(vboxlayout)
# put some nodes in the scene
scene = createScene()
# Camera
camera = self.view.camera()
camera.lens().setPerspectiveProjection(45.0, 16.0 / 9.0, 0.1, 1000.0)
camera.setPosition(QVector3D(0.0, 0.0, 40.0))
camera.setViewCenter(QVector3D(0.0, 0.0, 0.0))
# For camera controls.
camController = QFirstPersonCameraController(scene)
camController.setLinearSpeed(50.0)
camController.setLookSpeed(180.0)
camController.setCamera(camera)
# assign root node to the view
self.view.setRootEntity(scene)
我在控制台中收到以下错误:
QOpenGLContext::swapBuffers() called with non-exposed window, behavior is undefined
Qt3D.Renderer.Backend: bool __cdecl Qt3DRender::Render::GraphicsContext::makeCurrent(class QSurface *) makeCurrent failed
Qt3D.Renderer.Backend: bool __cdecl Qt3DRender::Render::GraphicsContext::makeCurrent(class QSurface *) makeCurrent failed