1.widget是源码什么意思
2.UE4-Slate源码学习(六)slate渲染Part2-Paint控件绘制
3.PyQt5系列教程(53):欢乐斗地主QMdiArea的使用
4.「Qt Widget中文示例指南」如何实现一个简单的RHI小部件示例(二)
widget是什么意思
Web Widget,中文译名被称作是微件,是一小块可以在任意一个基于HTML的Web页面上执行的代码,它的源码表现形式可能是视频,地图,源码新闻,源码小游戏等等。源码它的源码fcoinpython源码根本思想来源于代码复用,通常情况下,源码Widget的源码代码形式包含了DHTML,JavaScript以及Adobe Flash。
释义
词典解释
名词 n. 1.(作附件用的源码)小机械 2.(指工厂)未定名的主要新产品 3.美俚装饰物 4.电脑专用界面工具集
网络释义
1.构件 GTK术语表[中国电子技术论坛] -- P... widget 构件 2.小部件 MS-DOS信息英汉对照 计算机英语强化|... widget 小部件 3.小器具 英语新词汇与常用词汇的翻译() - ... widget 小器具 Widget (建议中文译名:微件)
简介
「Yahoo!Widget Engine」是一种基于JavaScript的应用程序平台,您必须先安装Widget引擎后才能使用各式各样的源码Widget工具。 Yahoo!源码Widget是源码由雅虎推出的免费并开放源码的桌面应用程序平台。它由Widget引擎和Widget工具两部分组成。源码能够极大的源码便利您的网络操作和完善您的桌面应用。Widget引擎提供了一个Ajax应用程序平台,源码在Windows和Mac OS X的操作系统环境下都可以使用。安装引擎后就能在此平台上运行各式各样的Widget工具了。
UE4-Slate源码学习(六)slate渲染Part2-Paint控件绘制
上一篇文章介绍了绘制一个SWindow的初期步骤,即计算整个UI树的控件大小,为绘制做准备。文章随后深入探讨了绘制流程的第二步,即执行FSlateApplication::PrivateDrawWindows()后,开始调用SWidget::Paint()函数,每个控件随后实现其虚函数OnPaint()。
在这一过程中,绘制参数被封装在FPaintArgs中,作为Paint和OnPaint过程中的关键引用参数。FSlateRHIRenderer与FSlateDrawBuffer是继承自FSlateRenderer的类,作为FSlateApplicationBase的全局变量,在构造时创建。在绘制过程中,通过GetDrawBuffer()函数可获取到FSlateDrawBuffer对象。
FSlateDrawBuffer实现了Slate的绘制缓冲区,内部封装了FSlateWindowElementList数组,智能管理系统源码用于存储多个SWindow下的绘制元素列表。每个SWindow通过AddWindowElementList()返回一个元素列表。
FSlateWindowElementList负载了SWindow内的所有图元信息,内部封装了FSlateDrawElement的数组,包含Cached和Uncached元素,以及SWindow的指针和用于渲染的批处理数据FSlateBatchData。
FSlateDrawElement是构建Slate渲染界面的基本块,封装了UI树节点控件需要渲染的相关信息,如渲染变换、位置、大小、层级ID、绘制效果等,以及后续渲染阶段需要的相关数据。
在Paint流程中,处理当前传入的SWindow和ChildWindows,首先判断窗口是否可见和是否最小化,然后从参数封装的OutDrawBuffer中获取WindowElementList。调用SWindow的PaintWindow()函数开始绘制窗口,并最终返回所有子控件计算完的最大层级。接着,子窗口递归绘制。
PaintWindow()函数在绘制窗口时,首先调用SetHittestArea()设置点击区域,HittestGrid会判断窗口大小是否改变,若不变则仅更新窗口在屏幕中的位置。构造FPaintArgs参数后,将其封装到FSlateInvalidationContext中。
FSlateInvalidationRoot类的PaintInvalidationRoot()函数可以作为控件树的根节点或叶子节点(SInvalidationPanel),构建快速路径避免每次绘制都计算大小和Paint函数,有利于优化。本篇文章主要分析正常慢速路径调用流程,优化相关将另文分析。无礼恐惧源码50
PaintSlowPath()函数从SWindow开始调用Paint()函数,并定义LayerId从0开始作为参数,进行实际的绘制相关计算。
Paint()函数首先处理裁剪、透明度混合、坐标转换等代码。若SWidget包含NeedsTick掩码,则调用Tick函数,我们在日常开发中通过蓝图或lua使用Tick函数时即调用到这里,通过SObjectWidget::Tick调用到UUserWidget::NativeTick供实现Tick。构造FSlateWidgetPersistentState PersistentState作为SWidget的变量,表示Paint时的状态。
PersistentState.CachedElementHandle将当前SWidget存储到FSlateWindowElementList中的WidgetDrawStack数组中。
更新FPaintArgs中的父节点参数和继承可点击测试参数,判断点击测试状态,然后将当前SWidget添加到点击测试中。调用虚函数OnPaint,由控件自己实现。
OnPaint()函数参数包括绘制参数引用、几何体、裁剪矩形、缓冲元素列表、层级、控件风格、父节点状态等。最后处理重绘标签、延迟绘制相关内容、UpdateWidgetProxy()根据缓存句柄更新快速路径中需要处理标记设置为Volatile不稳定状态的SWidget。
虚函数OnPaint()由子类自己实现,本文列举了SImage、SButton、SCompoundWidget和SConstraintCanvas的OnPaint()示例代码学习。
在SImage中,vscode源码编译设置简单判断Brush是否存在以及BrushDrawType的类型,然后调用FSlateDrawElement::MakeBox将控件添加到缓冲区元素列表中。
SButton继承自SCompoundWidget,GetBorder()根据当前按钮状态返回ui中设置的Enabled、Press、Hover、Disabled等状态的Brush。
SCompoundWidget作为合成节点,有且只能有一个子节点,且在Paint时强制将子节点的LayerId+1,同时SCompoundWidget可以单独设置混合颜色和透明度,影响子节点。
SConstraintCanvas作为SWidget的基类对应UMG中常用的UCanvasPanel,通过ArrangeLayeredChildren()对孩子进行层级排序,并根据孩子的层级是否相同存储bool值在ChildLayers中。遍历所有孩子,判断是否开启新层级,递归调用Paint函数,最后返回最大层级。
SConstraintCanvas::ArrangeLayeredChildren函数中,获取设置bExplicitChildZOrder,表示可以将同层一次渲染,有利于提高渲染器批处理。对所有孩子排序,排序规则为FSortSlotsByZOrder。遍历所有孩子,判断可见性掩码、计算偏移、锚点、位置、拉伸缩放等,封装成FArrangedWidget存储到ArrangedChildren中,用于OnPaint时有序遍历。星球重启源码狂风判断每个孩子ZOrder是否相同,相同则bNewLayer为false,大于LastZOrder则将bNewLayer设置为true,最终存储到ArrangedChildLayers中,用于OnPaint函数判断是否将layerId+1。
FSlateDrawElement::MakeBox()函数在OnPaint之后调用,将绘制控件的相关信息通过创建FSlateDrawElement绘制元素对象,添加到SWindow管理的FSlateWindowElementList元素列表中。创建Payload用于存储贴图等相关信息,根据控件Paint过程中的参数调用Element.Init初始化绘制元素,得到为该控件绘制创建的FSlateDrawElement对象。
总结整个Slate绘制流程的第二步,我们没有分析快速处理和优化细节,而是按照正常绘制流程分析代码。通过从PaintWindow开始遍历整个控件树,处理每个空间节点的Paint、OnPaint函数,最终目的是给每个控件创建一个FSlateDrawElement对象,存储渲染线程绘制所需的相关信息,并添加到FSlateWindowElementList中。理解了整个调用流程,整个过程较为清晰,本文基于UE4版本4..2。
PyQt5系列教程():欢乐斗地主QMdiArea的使用
上期文章中,我们一起探讨了QTabWidget、QStackedWidget和QDockWidget的运用,通过这些工具,我们能够实现在一个窗口内集成更多的组件。本期,我们转向学习QMdiArea,一个强大的工具,它提供了一个展示MDI窗口的区域,类似于Windows在一个屏幕上同时维护多个应用程序窗口,也适用于在一个显示区域内管理多个文件窗口。
QMdiArea的功能类似于MDI窗口的窗口管理器。它绘制并管理它所包含的窗口,提供级联或平铺布局,通常作为QMainWindow的中心部件用于创建MDI应用,但也可以放置在任何布局中。通过将区域添加到主窗口,代码如下所示:
添加QMdiArea到主窗口的代码片段。
每个子窗口都是QMdiSubWindow实例,通过addSubWindow()函数添加到MDI区域。通常会传递QWidget作为内部窗口部件,或直接传递QMdiSubWindow。子窗口继承QWidget,支持与正常顶层窗口相同的API编程。
子窗口在获取键盘焦点或调用setFocus()时变为活动状态。用户通过常规方式移动焦点来激活窗口。MDI区域在活动窗口改变时发出subWindowActivated()信号,而activeSubWindow()函数返回当前活动子窗口。
subWindowList()函数返回所有子窗口的列表,可用于创建包含窗口列表的弹出式菜单。
子窗口按照当前窗口排序,用于subWindowList()、activateNextSubWindow()和activatePreviousSubWindow()。在使用cascadeSubWindows()和tileSubWindows()进行窗口级联或平铺时,此排序规则同样重要。
QMdiArea提供内置的布局策略cascadeSubWindows()和tileSubWindows()。这些功能轻松集成到菜单条目中,用于管理窗口布局。
详细信息请参考官方文档。
本期实验通过模拟发放扑克牌,具体步骤包括发1张牌、随机发放5张牌和收牌清空操作。我们通过自定义QLabel类,赋予每个对象随机的扑克牌素材,将每一个QLabel视为一个QWidget,借助QMdiArea的相关函数实现这一过程。
使用QMdiArea的一部分代码展示。代码量并不繁重。
为了在工具栏上实现不同功能的按钮,可以参考相关知识点。若希望在工具栏按钮上显示文字,需添加特定代码。
新建QMdiArea对象,设置为主窗口的中心部件。cardlist为包含扑克牌文件名的列表。发1张牌,从cardlist随机选取一个元素即可。随机发放5张牌,从cardlist中选取包含5个元素的随机子列表。
发1张牌的代码示例。随机获取扑克牌文件名。
QMdiSubWindow是QMdiArea提供的子窗口类,代表MDI区域中的顶级窗口,包含窗口标题栏、内部窗口部件等,视样式可能还包括窗口框架和尺寸夹点。
构建QMdiSubWindow最常用方法是使用内部窗口部件调用QMdiArea.addSubWindow()。也可以自行创建子窗口,通过setWidget()设置内部窗口部件。
与常规顶级窗口编程类似,您可以使用相同的API,如show()、hide()、showMaximized()和setWindowTitle()等函数。
在代码中,通过setWidget()将自定义的QLabel类Card作为内部窗口部件,并通过addSubWindow()添加子窗口。
子窗口通常有最小化、最大化和关闭按钮。显示的扑克牌通过设置setWindowFlags(Qt.WindowMinimizeButtonHint)来仅显示最小化按钮。同时调整窗口大小并显示。
发5张牌的函数与上述功能类似,不再赘述。
通过这个函数可以快速关闭所有子窗口。
收牌的函数实质上是对子窗口进行排列,以级联模式排列所有子窗口。
平铺模式排列所有子窗口的方法是QMdiArea.tileSubWindows(),有兴趣的读者可以尝试。
本次学习内容较为基础,详细实现请下载源代码自行探索。
文章至此,希望大家喜欢本篇文章。如果你觉得有帮助,请给我点赞、赞赏或分享给好友。关注微信公众号:学点编程吧,发送“pyqt”获取本期代码。加油!(ง •̀_•́)ง (*•̀ㅂ•́)
「Qt Widget中文示例指南」如何实现一个简单的RHI小部件示例(二)
Qt 是一个强大的跨平台 C++ 开发工具,它提供了一次编写,所有平台无差别运行的能力,以及几乎覆盖所有开发过程中所需工具的完备性。Qt 已在众多行业和企业中得到广泛应用,支持数百万设备和应用。
本文将展示如何使用 QRhi、Qt 的 3D API 和着色语言抽象层渲染一个三角形。这在 QWidget 世界的 RHI 窗口示例中是一个对应示例,QRhiWidget 子类使用基本顶点和片段着色器渲染单个三角形,无需处理低级细节如窗口设置和 QRhi,因为这些由 QWidget 框架负责。QRhiWidget 实例被添加到 QVBoxLayout 中,保持示例紧凑。
在上篇文章中,我们介绍了结构和 main() 函数,本文将深入讲解渲染流程。在 examplewidget.cpp 中,小部件通过 Qt 资源系统加载.qsb 文件,使用辅助函数加载 QShader 对象。为了适应模块依赖和 qmake,本示例不采用 CMake 函数 qt_add_shaders(),而是将.qsb 文件作为源代码树的一部分。
initialize() 函数实现包括查询和存储 QRhi 对象以供后续使用,并在存在不匹配时(例如窗口移动时)触发重建图形资源。这个示例没有主动演示窗口间的修复,但已准备好处理调整窗口大小时可能出现的小部件大小变化。每次调用时都会被调用的 initialize() 函数确保查询最新的像素大小,无需特殊处理。
在需要创建图形资源时,initialize() 使用基于 QRhi 的典型代码完成工作。单个顶点缓冲区用于存储交错位置和颜色数据,模型视图投影矩阵通过统一缓冲区公开,这是唯一可见给着色器的资源。管道依赖于默认值(如关闭深度测试、禁用混合等)。顶点数据布局为 x, y, r, g, b,步幅为 5 个浮点数,第二个顶点输入属性(颜色)有 2 个浮点数的偏移量。
注意:这个示例依赖 QRhiWidget 的默认 autoRenderTarget 设置为 true,因此无需管理渲染目标,通过调用 renderTarget() 查询现有渲染目标。
最后,计算投影矩阵,它取决于小部件的大小,因此在每次调用时都完成。注意:投影矩阵包括 QRhi 的校正矩阵,以适应 3D API 的归一化设备坐标差异。
在渲染过程中,小部件记录单个呈现传递,其中包含单个绘制调用。在初始化步骤中计算的视图投影矩阵与模型矩阵结合,得到的矩阵写入统一缓冲区。记录带有 3 个顶点的绘制调用,绑定图形管道到命令缓冲区,并设置视口覆盖整个小部件。没有索引缓冲区,只有一个顶点缓冲区绑定。
一旦记录了渲染通道,调用 update() 请求新的框架,确保小部件不断更新,并且三角形看起来是旋转的。默认情况下,呈现线程(在此示例中为主线程)受到呈现速率的限制。在这个例子中,没有适当的动画系统,因此旋转将在每一帧中增加,导致三角形以不同的刷新率以不同的速度旋转。