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绘制。