QGLWidget,QOpenGLWidget和QOpenGLWindow简介

QGLWidget

QGLWidget 是Qt库提供的一个类,用于创建基于OpenGL的应用程序。它是QWidget类的子类,提供了基本的显示OpenGL图形功能。它还提供了一些额外的功能,用于与OpenGL上下文交互,例如基于事件的机制处理键盘和鼠标输入,以及在多个窗口部件之间共享OpenGL资源的能力。

使用QGLWidget的主要优点是它允许您轻松地将OpenGL图形集成到基于Qt的应用程序中,并提供了一种简单一致的方式来处理OpenGL上下文和事件。

要使用QGLWidget,需要包含适当的头文件并链接到QtOpenGL库。然后可以创建一个QGLWidget对象并在应用程序中作为常规窗口部件使用。您还可以对QGLWidget进行子类化并重写其虚拟方法1,例如initializeGL()2和paintGL()3,以添加自己的OpenGL渲染代码。4

需要注意的是QGLWidget已被认为是遗留类,建议使用QOpenGLWidget或QOpenGLWindow来代替。

QOpenGLWidget

QOpenGLWidget是Qt库提供的一个类,用于创建基于OpenGL的应用程序。它是QOpenGLWindow类的子类,提供了基本的显示OpenGL图形功能。它还提供了一些额外的功能,用于与OpenGL上下文交互,例如基于事件的机制处理键盘和鼠标输入,以及在多个窗口部件之间共享OpenGL资源的能力。

使用QOpenGLWidget的主要优点是它允许您轻松地将OpenGL图形集成到基于Qt的应用程序中,并提供了一种简单一致的方式来处理OpenGL上下文和事件。QOpenGLWidget是为了更现代,更高效地替代QGLWidget而设计的,并且推荐用于新的开发。它支持例如使用现代OpenGL核心配置文件和在多线程中使用OpenGL上下文等功能。

QOpenGLWidget函数简介

QOpenGLWidget有一个update()函数,它是QWidget类中的函数(QOpenGLWidget继承于QWidget),用于请求重绘窗口部件。 update()函数会立即重绘窗口部件,并触发paintEvent()事件。

还有一个updateGL()函数,它是QOpenGLWidget中的函数,用于请求重绘OpenGL渲染的部分,它会立即重绘OpenGL窗口部件,并触发paintGL()事件。

QOpenGLWidget也提供了一个**paintEvent()**函数,它是QWidget类中的虚拟函数,用于绘制窗口部件。 如果你需要在QOpenGLWidget上绘制2D图形,可以在paintEvent()中使用QPainter绘制。

如果你需要绘制OpenGL图形,可以在paintGL()函数中使用OpenGL函数绘制。

值得注意的是,update()和updateGL()函数只是请求重绘,而paintEvent()和paintGL()函数则是绘制的实际操作。

QOpenGLWindow

QOpenGLWindow是Qt中用来提供更底层的OpenGL渲染支持的类。 它是QWindow的子类,提供了基本的OpenGL渲染功能。

QOpenGLWindow提供了一组虚拟函数,用于在窗口渲染时调用,如initializeGL()和paintGL()。 可以在这些函数中使用OpenGL函数来绘制图形。

QOpenGLWindow也提供了一些额外的功能,用于在多线程中使用OpenGL上下文,并支持使用现代OpenGL特性。

QOpenGLWindow 是QOpenGLWidget的替代品,它提供了更底层的渲染支持。

能在QOpenGLWidget上用QPainter吗?

QOpenGLWidget是用来渲染OpenGL图形的,而QPainter是Qt的绘图类,用来绘制2D图形。

在QOpenGLWidget上使用QPainter可以通过重写paintEvent()函数来实现,在这个函数中可以使用QPainter绘制2D图形。

但是需要注意的是这样会有一些性能问题,因为QPainter在渲染2D图形时会使用软件渲染,而QOpenGLWidget使用硬件渲染,这两种方式并不能很好的兼容,在使用时可能会带来一定的性能问题。

如果你只需要绘制少量的2D图形,可以使用QPainter在paintEvent()中绘制,如果你需要绘制大量的2D图形,建议使用Qt的其他窗口部件,如QWidget,QGraphicsView等。当然,对于QOpenGLWindow来说也是如此。

这个函数通常是继承QGLWidget类并重写这个函数来实现自定义初始化。在这个函数中,可以调用各种OpenGL函数来配置OpenGL状态,如设置清除颜色,启用深度测试等。也可以在这里进行一些资源的初始化,如纹理的加载,着色器的编译等。

值得注意的是,initializeGL() 函数仅在第一次显示窗口部件或者第一次更改OpenGL上下文时被调用,如果窗口部件需要重新初始化,需要调用makeCurrent()函数将当前上下文设置为null再重新调用initializeGL()函数。

这个函数通常是继承QGLWidget类并重写这个函数来实现自定义渲染。在这个函数中,可以调用各种OpenGL函数来绘制3D图形,如使用顶点数组和纹理贴图绘制3D模型,使用着色器绘制阴影和反射等。

在paintGL()函数内部会自动管理OpenGL状态,例如设置投影矩阵和视图矩阵。

值得注意的是,paintGL() 函数不会在窗口部件刚刚创建时被调用,因此在这个函数中不应该进行任何初始化工作,而应该在initializeGL() 函数中进行。

你可以使用QGLFormat来创建一个配置好的QGLContext对象,然后将其与QGLWidget或其他OpenGL窗口部件关联起来。

QGLFormat有很多的成员函数来设置上下文的各种属性,如setVersion()来设置OpenGL的版本,setProfile()来设置OpenGL的profile, setSampleBuffers()来设置是否启用多重采样等。

QGLFormat也有一些静态函数来获取系统默认的配置,如defaultFormat()来获取系统默认的QGLFormat对象。

在使用QOpenGLWidget的时候可以使用QGLFormat来配置OpenGL上下文的参数, 也可以直接在QOpenGLWidget的构造函数中传入QGLFormat对象来创建配置好的QOpenGLWidget.


  1. 虚拟函数(virtual function)是指在 C++ 中,当一个函数在基类中声明为虚拟函数,并在派生类中重新定义时,该函数就成为虚拟函数。
    当一个对象的指针调用虚拟函数时,编译器会在运行时动态绑定到相应的函数。这意味着,即使在编译时不知道对象的类型,也能调用正确的函数。
    虚拟函数的一个重要用途是在多态性上,在基类的指针或引用上调用虚拟函数 ↩︎

  2. initializeGL() 是 QGLWidget 类中的一个虚拟函数,在窗口部件第一次显示时或者第一次更改OpenGL上下文时被调用。在这个函数中,可以编写OpenGL初始化代码,完成对OpenGL状态的配置和资源的创建。 ↩︎

  3. paintGL() 是 QGLWidget 类中的一个虚拟函数,在窗口部件需要重绘时被调用。在这个函数中,可以编写OpenGL渲染代码,在窗口部件上绘制3D图形。 ↩︎

  4. QGLFormat是Qt中用来配置OpenGL上下文的类。 它允许你设置OpenGL上下文的各种属性,如深度缓冲、双缓冲、多重采样等。 ↩︎

你可能感兴趣的:(OpenGL,qt,c++,ui)