pythonocc-core报错:

1. #使用vscode运行pyOCC环境的相关代码时遇到了如下报错

RuntimeError: Aspect_GraphicDeviceDefinitionErrorOpenGl_Window::CreateWindow: SetPixelFormat failed. Error code: 2000 raised from method Init of class Display3d

#根据这位博主的分享成功解决了问题 pythonocc-core报错:SetPixelFormat failed. Error code: 2000 raised from method Init of class Display3d-CSDN博客

2.解决办法

即:

打开运行环境文件:******\pyocc\lib\site-packages\ OCC \Display\qtDisplay.py

(如我的是C:\ProgramData\pyoccenv\lib\site-packages\OCC\Display\qtDisplay.py)

将38行内容从:

class qtBaseViewer(QtOpenGL.QGLWidget):

替换成

class qtBaseViewer(QtWidgets.QWidget):

3. 解释

觉得很神奇,查阅了一下,得到如下解释:

class qtBaseViewer(QtOpenGL.QGLWidget): 替换为 class qtBaseViewer(QtWidgets.QWidget): 通常是为了避免与OpenGL相关的问题,或者是出于简化代码、提高兼容性的考虑。以下是这两种类的主要区别和替换的可能原因:

(1)QtOpenGL.QGLWidgetQtWidgets.QWidget 的区别
  • QtOpenGL.QGLWidget :

    • 这是一个专门为OpenGL渲染设计的小部件,允许你直接在其中绘制OpenGL内容。

    • QGLWidget 通过继承 QWidget 类并添加了与OpenGL相关的功能,如上下文创建、缓冲区管理、渲染循环控制等,使得它特别适合用来开发3D图形应用。

    • 使用 QGLWidget 需要配置合适的OpenGL上下文,并且如果系统配置不当或驱动不兼容,可能会导致像素格式错误、渲染失败等问题。

  • QtWidgets.QWidget :

    • 这是一个通用的小部件,通常用于构建用户界面的基本元素。它没有与OpenGL直接相关的功能。

    • QWidget 更加轻量且兼容性更好,但如果你想使用OpenGL进行渲染,就需要手动管理OpenGL上下文和渲染过程。

(2) 替换为 QtWidgets.QWidget 的可能原因
  • 避免OpenGL依赖

    • 如果程序不需要进行OpenGL渲染,使用 QGLWidget 是没有必要的,反而可能引入不必要的复杂性和依赖。通过使用 QWidget ,你可以简化代码并避免与OpenGL相关的兼容性问题。
  • 兼容性和稳定性

    • QGLWidget 依赖于底层的OpenGL实现,如果系统的OpenGL配置不正确(如缺少驱动、版本不兼容等),可能会导致程序崩溃或无法正常工作。替换为 QWidget 可以避免这些问题,提供更广泛的兼容性。
  • 使用现代的OpenGL替代品

    • QGLWidget 已经被Qt的新类所取代,如 QOpenGLWidgetQOpenGLWidget 提供了更现代化的OpenGL支持和更好的性能。如果你不想使用旧的 QGLWidget ,但又需要OpenGL功能,可以考虑使用 QOpenGLWidget
(3) 什么时候替换
  • 不需要OpenGL功能 :如果你的应用程序不需要进行OpenGL渲染,仅仅是为了显示一些2D图形或普通的 用户界面 ,那么使用 QWidget 是更合适的选择。

  • 排查和解决问题 :如果你遇到了与OpenGL相关的错误,例如像素格式设置失败、渲染错误等,暂时切换到 QWidget 可能有助于确定问题是否与OpenGL有关。

  • 升级和维护 :如果你正在维护旧代码,并希望提高兼容性和代码的可维护性,切换到 QWidgetQOpenGLWidget 是值得考虑的。

(4)在替换后的调整
  • 如果你替换了 QGLWidgetQWidget ,但是仍然需要OpenGL渲染,你需要手动管理OpenGL上下文,并在 QWidgetpaintEvent 中进行OpenGL绘制。
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐