QT6窗口系统之QT底层窗口QWindow:QT框架中哪些常见窗口是基于QWindow的? 如何实现QT框架栅格窗口?如何实现QT框架OpenGL窗口?
QT6窗口系统之QT底层窗口QWindow:QT框架中哪些常见窗口是基于QWindow的? 如何实现QT框架栅格窗口?如何实现QT框架OpenGL窗口?
简介
本文介绍了QT6窗口系统中的QT底层窗口QWindow, QWindow提供的API,以及QT框架中哪些常见窗口是基于QWindow的。本文还介绍了如何使用QBackingStore和QWindow搭配使用实现QT框架栅格窗口,同时介绍了QBackingStore和QSurface的一些概念和 API。本文最后描述了如何使用QWindow和QOpenGLFunctions及QOpenContext等类型搭配使用实现QT框架中的 OpenGL窗口,使得QT应用程序充分发挥OpenGL的硬件加速能力。本文将依次介绍OpenGL API包装类 QOpenGLFunctions,OpenGL上下文包装类 QOpenGLContext,QWindow搭配OpenGL API实现 支持OpenGL的窗口,基于OpenGL API的QPainter画图。
目录
QT底层窗口QWindow是什么?
QWindow提供了哪些API接口?
QT框架中有哪些常见窗口是基于QWindow的?
QWindow之栅格窗口
QWindow之OpenGL窗口
QML窗口QQuickWindow
QWidget窗口
QOpenGLWidget窗口
QQuickWidget窗口
栅格窗口(ButianyunRasterWindow)
运行效果
QBackingStore 如何和 QW indow搭配实现栅格窗口?
后台(QBackingStore)
QBackingStore是什么?
QBackingStore提供了哪些API接口?
表面(QSurface)
QSurface是什么?
QSurface提供了哪些API接口?
QT6的图形框架
OpenGL API包装类 QOpenGLFunctions
OpenGL上下文包装类 QOpenGLContext
QWindow搭配OpenGL API实现OpenGL窗口
基于OpenGL API的QPainter画图
正文
QT底层窗口QWindow是什么?
QT 框架中的QWindow表示底层窗口系统中的一个窗口。QT框架中的各种窗口类型,在最底层都是QWindow。 QWindoow通常不直接使用,在搭配一些必备的组件之后可以用于创建一个底层窗口。QWindow是QObject和QSurface的派生类型。QWindow是Gui模块的类型。
QWindow提供了哪些API接口?
QWindow提供了哪些API接口?
QWindow提供了哪些API接口?
QWindow提供了哪些API接口?
QWindow提供了哪些API接口?
QT框架中有哪些常见窗口是基于QWindow的?
QWindow之栅格窗口
QWindow和QBackingStore搭配使用就可以构造出QT框架中的栅格窗口。在这种窗口中通常使用QPainter执行各种绘图操作,绘图结果可以缓存在QBackingStore的图像中。QWidget严格来讲也算是一种栅格窗口,因为栅格窗口并不是一种具体C++类型,只是QT中的一个概念。
QWindow之OpenGL窗口
QWindow和QOpenGLFunctions以及QOpenGLContext搭配使用就可以构造出QT框架中的OpenGL窗口。在这种窗口中通常使用OpenGL API执行各种绘图操作。OpenGL窗口也不是一种具体的C++类型,只是 QT中的一个概念。
QML窗口QQuickWindow
QT QML中的窗口QQuickWindow是 QWindow的直接派生类型。用于实现QML中的Window类型。QQuickWindow是 Quick模块的类型。
QWidget窗口
QT Widgets模块中的QWidget类型是通常所讲的QT窗口,也是 QT传统应用中常用的窗口类型。 QWidget尽管并不是 QWindow的派生类型,但是QWidget窗口仍然是QWindow窗口,在QWidget内部仍然会创建QWindow对象实例并且持有QWindow对象指针。 QWidget和QWindow的关系,不是通常的继承关系,而是逻辑意义上的间接的关联关系而已。 QWidget 是 Widgets模块的类型。
QOpenGLWidget窗口
QOpenGLWidget窗口用来执行OpenGL绘图操作,提供了一系列的函数对 QWidget窗口使用 OpenGL API做了一些封装,使得使用 OpenGL更方便一些。QOpenGLWidget是openglwidgets模块的类型。
QQuickWidget窗口
QQuickWidget窗口类型是 QWidget的派生类型,为 QWidget窗口应用程序加载 QML文件提供了一些包装,使得 同一个QT应用程序中的QWidget 窗口和QML 窗口可以很好的集成在同一个窗口中。QQuickWidget是quickwidgets模块的类型。
栅格窗口(ButianyunRasterWindow)
运行效果
栅格窗口(ButianyunRasterWindow)运行效果如下图所示。
ButianyunRasterWindow栅格窗口运行效果
QBackingStore 如何和 QWindow搭配实现栅格窗口?
ButianyunRasterWindow类型
ButianyunRasterWindow::render()函数
ButianyunRasterWindow::renderNow()函数
ButianyunRasterWindow::event()函数
表面(QSurface)
QSurface是什么?
QSurface是QT框架中表达可渲染表面的一个抽象类型。 QSurface 是 Gui模块提供的类型。
存在两种类别(SurfaceClass)的表面:窗口表面比如QWindow和离屏表面比如QOffscreenSurface,前者用于在线渲染到屏幕,后者用于离线渲染到纹理。
QSurface的两种类别
表面类型(SurfaceType)描述了底层渲染引擎是什么以及使用底层渲染引擎的途径。从这个类型也可以看到,QT框架支持CPU渲染、OpenGL在线渲染、OpenGL离线渲染、OpenVG渲染、Vulkan渲染、Meta渲染、Direct3D渲染,基本上包括了目前常见的渲染引擎和渲染途径。
QSurface表面类型
QSurface提供了哪些API接口?
一个概念提供的基础能力往往决定了一个抽象类型提供哪些API接口。反过来,通过查看一个抽象类型的API接口,也可以窥探出一个概念的设计意图。
QSurface 提供的API接口
后台(QBackingStore)
QBackingStore是什么?
QBackingStore是 Gui模块中的类型。QBackingStore 使得在一个类型为栅格表面的QWindow上使用QPainter绘图成为可能。渲染到QWindow上的另一种途径是通过QOpenGLContext使用 OpenGL绘图。
QBackingStore 包含窗口内容的缓冲的表达,并且支持使用QPainter进行局部更新,达到只更新Windows内容的一个区域的目的。
那些只使用 QPainter而不使用OpenGL加速,也没有使用QWidget或QGraphicsView 界面栈的额外负担的应用程序可以使用QBackingStore。
QBackingStore提供了哪些API接口?
QBackingStore的API接口
QT6的图形框架
讨论QT6的图形框架时,很多人都会提到QT框架中的这一个架构图。
QT6图形架构
QT6明确指出,QT6支持的图形引擎包括以下一些:
QT6支持的图形引擎
正是因为这种坚实的底层架构支持,QT QML/QT Quick应用程序才能充分利用GPU硬件加速的能力。
OpenGL API包装类 QOpenGLFunctions
QOpenGLFunctions类型提供了OpenGL ES 2.0 API的包装类功能,QOpenGLExtraFunctions类型则提供了OpenGL ES 3.0, 3.1 and 3.2 API的包装类功能。这两个类型是 Gui 模块提供的类型。这些类型的核心功能是将OpenGL具体实现动态链接库中的C语言版本的OpenGL API通过函数指针包装为C++成员函数。
而更多细分版本的API profile包装类则是以QAbstractOpenGLFunctions这个抽象类型作为基类的,比如下面这些类型则是opengl模块提供的类型。
QT6支持的OpenGL版本
QT6支持的OpenGL版本
OpenGL上下文包装类 QOpenGLContext
QOpenGLContext是 Gui 模块提供的类型。 QOpenGLContext表达了一个原生OpenGL上下文,使得OpenGL API 能够在一个表面上进行渲染。
通过调用makeCurrent()使得一个上下文能够在一个给定的表面上成为当前上下文。当 OpenGL渲染完成之后,调用swapBuffers()来交换表面的前后缓冲区,这样新渲染的内容成为可见。为了支持特定的平台,QOpenGLContext要求你在开始渲染一个新的帧画面之前,在调用 swapBuffers()之后,再次调用makeCurrent()函数。
QOpenGLContext提供了下面这些API接口。
QOpenGLContext类型的API
QWindow搭配OpenGL API实现OpenGL窗口
先看具体效果。
QT6 OpenGL实例运行效果
然后贴上ButianyunOpenGLWindow的类型定义:
ButianyunOpenGLWindow类型定义
然后是具体实现。
ButianyunOpenGLWindow构造函数
ButianyunOpenGLWindow事件处理函数
ButianyunOpenGLWindow事件处理函数
ButianyunOpenGLWindow渲染总控函数
最后是派生类窗口中使用OpenGL画矩形。
具体类型ButianyunRectangleWindow初始化函数
具体类型ButianyunRectangleWindow渲染函数
具体类型ButianyunRectangleWindow渲染函数
基于OpenGL API的QPainter画图
QT基于OpenGL的绘图设备类型QOpenGLPaintDevice是QPaintDevice的派生类型,可以和QPainter搭配使用,使得看起来很传统的QPainter也可以充分发挥OpenGL的绘图能力。这种模式下在QPainter执行绘图操作时实际使用的绘图引擎是QOpenGL2PaintEngineEx类型,而不再是传统的QRasterPaintEngine。
先看运行效果:
OpenGL和QPainter搭配使用运行效果
再看具体代码。
ButianyunOpenGLWindowWithQPainter类型定义
ButianyunOpenGLWindowWithQPainter渲染函数
总结
本文先介绍了QT6窗口系统中的QT底层窗口QWindow, QWindow提供的API,以及QT框架中基于QWindow的几种常见窗口,比如栅格窗口和OpenGL窗口等。
本文还介绍了如何使用QBackingStore和QWindow搭配使用实现QT框架栅格窗口,同时介绍了QBackingStore和QSurface的一些概念和 API。
本文最后还介绍了如何使用QWindow和QOpenGLFunctions及QOpenContext等类型搭配使用实现QT框架中的 OpenGL窗口,使得QT应用程序充分发挥OpenGL的硬件加速能力。本文依次介绍了OpenGL API包装类 QOpenGLFunctions,OpenGL上下文包装类 QOpenGLContext,QWindow搭配OpenGL API实现 支持OpenGL的窗口,基于OpenGL API的QPainter画图。
如果您认为这篇文章对您有所帮助,请您一定立即点赞+喜欢+收藏,本文作者将能从您的点赞+喜欢+收藏中获取到创作新的好文章的动力。如果您认为作者写的文章还有一些参考价值,您也可以关注这篇文章的作者。