PyQt5 中包含的 3D 窗口

2023-12-11

我正在使用 PyQt5 并尝试将包含的 3D 窗口实现到从 .ui 文件生成的 python 文件中。我创建了一个 contains3dWindow 类,它继承自 QWidget,它只创建一个 3D 窗口,并且我试图将包含的窗口添加到主窗口文件中的 VBoxLayout 中。但是,当我在主窗口文件中创建 contains3dWindow 类的实例时,我收到以下错误消息:

警告:创建全局共享上下文后使用不同版本或配置文件设置新的默认格式可能会导致上下文共享出现问题。 无法使上下文成为当前上下文:OpenGL 资源不会被破坏

当我运行主文件时,主窗口显示不到一秒钟,然后程序关闭。这是包含窗口的函数,位于文件 cwindow.py 中:

from PyQt5.QtWidgets import QApplication, QWidget, QHBoxLayout, QCheckBox, QCommandLinkButton, \
    QVBoxLayout
from PyQt5.Qt3DExtras import QTorusMesh, QPhongMaterial, QConeMesh, QCylinderMesh, \
    QCuboidMesh, QPlaneMesh, QSphereMesh, Qt3DWindow, QFirstPersonCameraController

import sys

class contained3dWindow(QWidget):
    def __init__(self):
        super().__init__()
        view = Qt3DWindow()

这是主窗口文件中的代码:

from PyQt5 import QtCore, QtGui, QtWidgets
import cwindow

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        #Generated by pyuic
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(1416, 1041)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.verticalLayoutWidget = QtWidgets.QWidget(self.centralwidget)
        self.verticalLayoutWidget.setGeometry(QtCore.QRect(250, 160, 1051, 721))
        self.verticalLayoutWidget.setObjectName("verticalLayoutWidget")
        self.verticalLayout = QtWidgets.QVBoxLayout(self.verticalLayoutWidget)
        self.verticalLayout.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout.setObjectName("verticalLayout")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 1416, 38))
        self.menubar.setObjectName("menubar")
        self.menuFile = QtWidgets.QMenu(self.menubar)
        self.menuFile.setObjectName("menuFile")
        self.menuEdit = QtWidgets.QMenu(self.menubar)
        self.menuEdit.setObjectName("menuEdit")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)
        self.menubar.addAction(self.menuFile.menuAction())
        self.menubar.addAction(self.menuEdit.menuAction())

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)


        #Source of the problem. Error occurs when the contained3dWindow instance is created
        c_window = cwindow.contained3dWindow()
        self.verticalLayout.addWidget(c_window)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.menuFile.setTitle(_translate("MainWindow", "File"))
        self.menuEdit.setTitle(_translate("MainWindow", "Edit"))


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)

    MainWindow.show()
    sys.exit(app.exec_())

setupUi函数中创建了contained3dWindow对象,如果没有创建该对象,程序将按预期运行。 PyQt 文档非常薄弱,我只发现另外一个人遇到了这个问题(https://bugreports.qt.io/browse/QTBUG-60614)。任何帮助是极大的赞赏。


我不知道错误的确切原因是什么,我怀疑它与内存释放有关,但以下代码不会产生该问题,所以现在我应该解决您的问题

窗口.py

from PyQt5.QtWidgets import QWidget, QVBoxLayout
from PyQt5.Qt3DExtras import Qt3DWindow, QFirstPersonCameraController
from PyQt5.Qt3DCore import QEntity

class contained3dWindow(QWidget):
    def __init__(self):
        super().__init__()
        lay = QVBoxLayout(self)
        self.view = Qt3DWindow()
        container = QWidget.createWindowContainer(self.view)
        lay.addWidget(container)
        self.rootEntity = QEntity()
        cameraEntity = self.view.camera()
        camController = QFirstPersonCameraController(self.rootEntity)
        camController.setCamera(cameraEntity)
        self.view.setRootEntity(self.rootEntity)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PyQt5 中包含的 3D 窗口 的相关文章

随机推荐

  • PHP:在指定的时间内回显消息

    我想显示一个字符串 您的状态已发布 大约 3 秒左右 然后我希望它消失 截至目前 我有一个新闻提要 用户可以在其中发布消息 并且在发布消息后回显该文本字符串 直到重新输入 URL 有没有人有什么建议 if POST submit body
  • Matlab - 2次方矩阵

    In Matlab 我输入了以下命令 gt gt a 1 2 3 4 a 1 2 3 4 当我尝试命令时a 2 我得到以下内容 gt gt a 2 ans 7 10 15 22 我实际上期望得到 ans 1 4 9 16 换句话说 我期望将
  • 如何将模板变量传递给模板辅助函数以保留上下文?

    我可能使用了错误的词语来描述我的问题 所以这是我正在使用的 简化的 代码 我很高兴学习更好的方法来做到这一点 但我目前正在尝试做的是通过 assigneeId 到名为的模板辅助函数agentIs 问题是我找不到传递该值的正确方法
  • 左/右透明剪切箭头

    我知道之前已经回答过这个问题 但是那是针对 div 的底部 我无法弄清楚如何为 div 的左侧和右侧执行此操作 我试图达到与此相同的效果 BODY background url http farm6 staticflickr com 550
  • 如何检测DIV的维度发生变化?

    我有以下示例 html 其中有一个宽度为 100 的 DIV 它包含一些元素 在执行窗口大小调整时 内部元素可能会重新定位 并且 div 的尺寸可能会发生变化 我问是否可以hook div 的尺寸变化事件 以及如何做到这一点 我目前将回调函
  • QThread 执行冻结了我的 GUI

    我是多线程编程的新手 我用 Qt 编写了这个简单的多线程程序 但是当我运行这个程序时 它冻结了我的 GUI 当我在窗口中单击时 它会响应说您的程序没有响应 这是我的小部件类 我的线程开始计算一个整数 并在该数字可被 1000 整除时发出它
  • 客户端布局是否使一切都成为客户端?如果是这样,如何在保持其服务器组件的同时向其添加客户端交互性?

    我试图了解如何使用服务器组件处理模式打开 关闭 以前 对于客户端组件 我只需将状态提升到我的Layout export default function Layout children const showPopup setShowPopu
  • 工厂方法反if实现

    我正在我的 C 项目中应用工厂设计模式 下面您可以看到我是如何做的 我尝试通过遵循 反 if 活动来改进我的代码 因此想删除我所拥有的 if 语句 知道我该怎么做吗 typedef std map
  • 将 Swift 字符串编码为转义的 unicode?

    API数据字段仅支持ASCII编码 但我需要支持Unicode 表情符号 外来字符等 我想将用户的文本输入编码为转义的 unicode 字符串 let textContainingUnicode Let s go in the And so
  • C/C++ 警告:BDADDR_ANY 蓝牙库的临时地址

    我在 Ubuntu 下使用 g 和使用蓝牙库的 C C 程序的编译过程时遇到一些问题 如果我使用 gcc 它工作正常 没有任何警告 相反 如果我使用 g 我会收到此警告 警告 正在获取临时地址 即使程序编译良好并且可以工作 报告错误涉及的行
  • 从 2 个表中 SELECT 到 dataGridView 时出现 GROUP BY 问题

    在你的帮助下我做了这两个QUERY 我发布了图片 以便您可以在green squares是我想看到的空值red squares是我不想显示的值 多变的vyberradek插入 子项 的值INT在数据库中 但我通过了它string 所以我会简
  • 使用 -> 访问结构体的属性,但编译器错误告诉我使用 ->?

    这是我第一次使用C 不太温柔 我正在尝试用其他语言做一些我熟悉的事情 但是这个指针问题对我打击很大 我收到错误消息 recordFunctions c 178 20 error firstRecord is a pointer did yo
  • 如何获得一种布局,其中一个文本可以增长和椭圆化,但不会吞噬布局上的其他元素

    我读过这里的一些其他帖子 例如两个并排的 TextView 只有一个要椭圆化 但我的布局仍然有问题 我有一个列表项布局 我希望列表中的每个项目如下所示 展开 TextView 1 TextView 2 图片 TextView 2 和图像必须
  • 如何避免 data.table 中出现优化警告

    我有以下代码 gt dt lt data table a c rep 3 5 rep 4 5 b 1 10 c 11 20 d 21 30 key a gt dt a b c d 1 3 1 11 21 2 3 2 12 22 3 3 3
  • 矩阵-矩阵乘法的函数 numpy.dot()、@ 和方法 .dot() 有什么区别?

    有什么区别吗 如果不是 按照惯例首选什么 性能看起来几乎是一样的 a np random rand 1000 1000 b np random rand 1000 1000 timeit a dot b 14 3 ms 374 s per
  • OpenLDAP 动态组不按成员搜索

    我很困惑 我在 OpenLDAP 中有一个动态组 dn cn DynamicGroup ou Group dc MyDomain cn DynamicGroup objectClass groupOfURLs memberURL ldap
  • C++ 函数中的指针

    我知道从技术上讲 以下三种方法都是有效的 但是是否有任何逻辑理由以一种或另一种方式这样做 我的意思是 C 中的很多东西都是 技术上有效的 但这并没有让它们变得不那么愚蠢 int someFunction int input code or
  • SQLAlchemy NoSuchModuleError:无法加载插件:sqlalchemy.dialects:spanner

    Problem 我们正在尝试通过以下方式连接到 Cloud SpannerSQLAlchemy版本1 3 23 and python spanner sqlalchemy 使用Poetry对于依赖管理 sqlalchemy spanner已
  • 隐式函数指针转换

    根据 tcc gcc 和 clang 的经验 指向 旧式函数返回RetTp和一个指向任何原型的指针 函数返回RetTp可以相互隐式转换 compiles without warnings typedef void RetTp RetTp o
  • PyQt5 中包含的 3D 窗口

    我正在使用 PyQt5 并尝试将包含的 3D 窗口实现到从 ui 文件生成的 python 文件中 我创建了一个 contains3dWindow 类 它继承自 QWidget 它只创建一个 3D 窗口 并且我试图将包含的窗口添加到主窗口文