pythonocc-core报错:SetPixelFormat failed. Error code: 2000 raised from method Init of class Display3d
根据这位博主的分享成功解决了问题。
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.QGLWidget 与 QtWidgets.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相关的兼容性问题。
- 如果程序不需要进行OpenGL渲染,使用
-
兼容性和稳定性 :
QGLWidget依赖于底层的OpenGL实现,如果系统的OpenGL配置不正确(如缺少驱动、版本不兼容等),可能会导致程序崩溃或无法正常工作。替换为QWidget可以避免这些问题,提供更广泛的兼容性。
-
使用现代的OpenGL替代品 :
QGLWidget已经被Qt的新类所取代,如QOpenGLWidget。QOpenGLWidget提供了更现代化的OpenGL支持和更好的性能。如果你不想使用旧的QGLWidget,但又需要OpenGL功能,可以考虑使用QOpenGLWidget。
(3) 什么时候替换
-
不需要OpenGL功能 :如果你的应用程序不需要进行OpenGL渲染,仅仅是为了显示一些2D图形或普通的 用户界面 ,那么使用
QWidget是更合适的选择。 -
排查和解决问题 :如果你遇到了与OpenGL相关的错误,例如像素格式设置失败、渲染错误等,暂时切换到
QWidget可能有助于确定问题是否与OpenGL有关。 -
升级和维护 :如果你正在维护旧代码,并希望提高兼容性和代码的可维护性,切换到
QWidget或QOpenGLWidget是值得考虑的。
(4)在替换后的调整
- 如果你替换了
QGLWidget为QWidget,但是仍然需要OpenGL渲染,你需要手动管理OpenGL上下文,并在QWidget的paintEvent中进行OpenGL绘制。
更多推荐


所有评论(0)