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画图。
如果您认为这篇文章对您有所帮助,请您一定立即点赞+喜欢+收藏,本文作者将能从您的点赞+喜欢+收藏中获取到创作新的好文章的动力。如果您认为作者写的文章还有一些参考价值,您也可以关注这篇文章的作者。
QT6窗口系统之QT底层窗口QWindow:QT框架中哪些常见窗口是基于QWindow的? 如何实现QT框架栅格窗口?如何实现QT框架OpenGL窗口?的更多相关文章
- X窗口系统名词解释
前端时间Gentoo的桌面环境出了点问题,发现自己对Linux的桌面环境了解的很少,于是恶补了一下知识,以下名词解释基本上都是来自维基百科的条目和<Linux程序设计(第三版)>.一般而言 ...
- PHP框架中的日志系统
现在在一家公司做PHP后台开发程序猿(我们组没有前端,做活动时会做前端的东西),刚开始到公司的时候花2个周赶出了一个前端加后台的活动(记得当时做不出来周末加了两天班...),到现在过去4个多月了,可以 ...
- 深度探索QT窗口系统(五篇)
窗口作为界面编程中最重要的部分,没有窗口就没有界面,是窗口让我们摆脱了DOS时代,按钮是一个窗口,文本框是一个窗口,标签页是一个窗口,...一个窗口可以由多个窗口组成,每天我们都在与窗口打交道,当你打 ...
- 界面编程之QT窗口系统20180726
/*******************************************************************************************/ 一.坐标系统 ...
- 在Qt 4.4中,Alien Widget诞生了(Window负责与窗口系统的联系。Alien被号称是所有闪烁的终结者)
2011年09月29日 23:47:46 阅读数:7269 Qt 4.0 automatically double-buffers Qt 4.1 QWidget::autoFillBackground ...
- X窗口系统的协议和架构
转自X窗口系统的协议和架构 在电脑中,X窗口系统(常称作 X11.X)是一种以位图显示的网络透明化窗口系统.本条目详述 X11 的协议及其技术架构. X C/S模型和网络透明性 X 基于C/S模型.运 ...
- 第六篇 ANDROID窗口系统机制之显示机制
第六篇 ANDROID窗口系统机制之显示机制 ANDROID的显示系统是整个框架中最复杂的系统之一,涉及包括窗口管理服务.VIEW视图系统.SurfaceFlinger本地服务.硬件加速等.窗口管理服 ...
- Android窗口系统第三篇---WindowManagerService中窗口的组织方式
Android窗口系统第一篇—Window的类型与Z-Order确定 Android窗口系统第二篇—Window的添加过程 上面文章梳理了一个窗口的添加过程,系统中有很多应用,每个应用有多个Activ ...
- Android窗口系统第二篇---Window的添加过程
以前写过客户端Window的创建过程,大概是这样子的.我们一开始从Thread中的handleLaunchActivity方法开始分析,首先加载Activity的字节码文件,利用反射的方式创建一个Ac ...
- Android窗口系统第一篇---Window的类型与Z-Order确定
Android的窗口系统是UI架构很重要的一部分,数据结构比较多,细节比较多.本篇文章主要介绍窗口相关数据结构和抽象概念理解,关于[窗口部分的博客]计划如下. 1.窗口Z-Order的管理 2.应用程 ...
随机推荐
- Bash 技巧
Bash 使用技巧 Bash 是 GNU 项目的 Bourne Again SHell, 具有交互式命令行编辑.支持它的体系结构上的作业控制.类似 csh 的功能 Bash 是免费软件,根据 GNU ...
- NVIDIA公司推出的GPU运行环境下的机器人仿真环境(NVIDIA Isaac Gym)—— 到底实现了什么功能,意义价值又是什么???
相关内容: NVIDIA公司推出的GPU运行环境下的机器人仿真环境(NVIDIA Isaac Gym)的安装--强化学习的仿真训练环境 ================================ ...
- 【转载】 NumPy之:数据类型对象dtype
原文地址: https://www.cnblogs.com/flydean/p/14720858.html ============================================== ...
- 关于我升级VS16.8,结果一些项目运行报错“Phx.FatalError”这件事
背景 不知道啥时候开始,一些的项目不能好好运行了.一运行就报错 解决办法 https://developercommunity.visualstudio.com/content/problem/125 ...
- Codeforces Round 911 (Div. 2) D
Codeforces Round 911 (Div. 2) D D. Small GCD 题意 定义\(f(a,b,c)\)为\(a,b,c\)中较小两个数的\(gcd\),给定数组\(a_{1... ...
- SMU Summer 2023 Contest Round 11(2022-2023 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2022))
SMU Summer 2023 Contest Round 11(2022-2023 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2022 ...
- 「TCP/UDP」一个端口号可以同时被两个进程绑定吗?
一.1个端口号可以同时被两个进程绑定吗? 根据端口号的绑定我们分以下几种情况来讨论: 2个进程分别建立TCP server,使用同一个端口号8888 2个进程分别建立UDP server,使用同一个端 ...
- Go 进程在容器中无 coredump 产生问题分析
Go 进程在容器中无 coredump 产生问题分析 0x01 起因 coredump 作为一种非常重要的高度手段,在日常开发中经常用到,切换到容器环境后一直没关注.最近测试了下,发现出不了 core ...
- 使用image-syncer镜像同步工具将阿里云镜像仓库镜像迁移至私有Harbor
借助于阿里云开源的镜像同步工具image-syncer实现harbor及阿里云镜像仓库之间的镜像迁移 下载镜像同步工具 curl -fL "https://wiseo-generic.pkg ...
- Docker 导出容器 / 镜像
有时由于镜像大小.网络限制等原因,我们不能将本地制作的容器 / 镜像上传到公共容器注册表.此时我们可以选择将镜像以本地文件的形式导出. 导入 / 导出容器 docker export "CO ...