将3D视图添加到基于QWidget的UI

时间:2018-01-13 08:29:09

标签: python qt pyqt pyqt5

我正在尝试使用菜单,状态栏等向现有QMainWindow添加3D视图。我知道有两种方法可以达到这个目的:

选项1

选项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

选项2适用于我,但现在我无法访问Qt3DWindow.camera()Qt3DWindow.setRootEntity()等高级功能。

相反,所有在线教程都显示您可以使用QGLWidget绘制三角形,但不进一步使用/重新实现高级界面和场景图。

据我了解,PyQt5官方示例中也没有证明这一点。 basicshapes-py.py示例是我想要实现的最接近的事情,但它似乎为Qt3DWindow添加了一些按钮,这对我来说不好,因为我需要一个QMainWindow作为基类。

因此,将3D视图集成到基于QWidget的UI的推荐方法是什么?

编辑(使用选项1)

来自@ 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

0 个答案:

没有答案