QQuickWindow 类
QQuickWindow 类提供了显示图形 QML 场景的窗口。 更多...
| 头文件 | #include <QQuickWindow> | 
| CMake | find_package(Qt6 REQUIRED COMPONENTS Quick) target_link_libraries(mytarget PRIVATE Qt6::Quick) | 
| qmake | QT += quick | 
| 由以下类实例化 | 窗口 | 
| 继承自 | QWindow | 
| 继承自 | 
公共类型
| 结构体 | GraphicsStateInfo | 
| 枚举 | CreateTextureOption { TextureHasAlphaChannel, TextureHasMipmaps, TextureOwnsGLTexture, TextureCanUseAtlas, TextureIsOpaque } | 
| 标志 | CreateTextureOptions | 
| 枚举 | RenderStage { BeforeSynchronizingStage, AfterSynchronizingStage, BeforeRenderingStage, AfterRenderingStage, AfterSwapStage, NoStage } | 
| 枚举 | SceneGraphError { ContextNotAvailable } | 
| 枚举 | TextRenderType { QtTextRendering, NativeTextRendering, CurveTextRendering } | 
属性
- activeFocusItem : QQuickItem* const
- color : QColor
- contentItem : QQuickItem* const
- transientParent : QWindow* const
公共函数
| QQuickWindow(QWindow *parent = nullptr) | |
| QQuickWindow(QQuickRenderControl *control) | |
| virtual | ~QQuickWindow() override | 
| QQuickItem * | activeFocusItem() const | 
| void | beginExternalCommands() | 
| QColor | color() const | 
| QQuickItem * | contentItem() const | 
| QSGImageNode * | createImageNode() const | 
| QSGNinePatchNode * | createNinePatchNode() const | 
| QSGRectangleNode * | createRectangleNode() const | 
| (since 6.7)QSGTextNode * | createTextNode() const | 
| QSGTexture * | createTextureFromImage(const QImage &image, QQuickWindow::CreateTextureOptions options) const | 
| QSGTexture * | createTextureFromImage(const QImage &image) const | 
| (since 6.6)QSGTexture * | createTextureFromRhiTexture(QRhiTexture *texture, QQuickWindow::CreateTextureOptions options = {}) const | 
| qreal | effectiveDevicePixelRatio() const | 
| void | 结束外部命令() | 
| QImage | 捕获窗口() | 
| (since 6.0)QQuickGraphicsConfiguration | graphicsConfiguration() const | 
| (since 6.0)QQuickGraphicsDevice | graphicsDevice() const | 
| const QQuickWindow::GraphicsStateInfo & | graphicsStateInfo() | 
| QQmlIncubationController * | incubationController() const | 
| bool | isPersistentGraphics() const | 
| bool | isPersistentSceneGraph() const | 
| bool | isSceneGraphInitialized() const | 
| (since 6.0)QQuickRenderTarget | renderTarget() const | 
| QSGRendererInterface * | rendererInterface() const | 
| (since 6.6)QRhi * | rhi() const | 
| void | scheduleRenderJob(QRunnable *job, QQuickWindow::RenderStage stage) | 
| void | setColor(const QColor &color) | 
| (since 6.0)void | setGraphicsConfiguration(const QQuickGraphicsConfiguration &config) | 
| (since 6.0)void | setGraphicsDevice(const QQuickGraphicsDevice &device) | 
| void | setPersistentGraphics(bool persistent) | 
| void | setPersistentSceneGraph(bool persistent) | 
| (since 6.0)void | setRenderTarget(const QQuickRenderTarget &target) | 
| (since 6.6)QRhiSwapChain * | swapChain() const | 
重新实现公共函数
| virtual QAccessibleInterface * | accessibleRoot() const override | 
公共槽
信号
| void | 活动焦点项目更改() | 
| void | 动画后() | 
| (since 6.0)void | 帧结束后() | 
| void | 记录渲染传递后() | 
| void | 渲染后() | 
| void | 同步后() | 
| (since 6.0)void | 帧开始前() | 
| void | 记录渲染传递前() | 
| void | 渲染前() | 
| void | 同步前() | 
| void | 颜色更改(const QColor &) | 
| void | 帧交换() | 
| void | 场景图即将停止() | 
| void | 场景图错误(QQuickWindow::SceneGraphError error, const QString &message) | 
| void | 场景图初始化() | 
| void | 场景图无效() | 
静态公共成员
| (since 6.0)QSGRendererInterface::GraphicsApi | graphicsApi() | 
| bool | hasDefaultAlphaBuffer() | 
| QString | sceneGraphBackend() | 
| void | setDefaultAlphaBuffer(bool useAlpha) | 
| (since 6.0)void | setGraphicsApi(QSGRendererInterface::GraphicsApi api) | 
| void | setSceneGraphBackend(const QString &backend) | 
| void | setTextRenderType(QQuickWindow::TextRenderType renderType) | 
| QQuickWindow::TextRenderType | textRenderType() | 
重新实现保护函数
| virtual void | closeEvent(QCloseEvent *e) override | 
| virtual bool | event(QEvent *event) override | 
| virtual void | exposeEvent(QExposeEvent *) override | 
| virtual void | focusInEvent(QFocusEvent *ev) override | 
| virtual void | focusOutEvent(QFocusEvent *ev) override | 
| virtual void | hideEvent(QHideEvent *) override | 
| virtual void | keyPressEvent(QKeyEvent *e) override | 
| virtual void | keyReleaseEvent(QKeyEvent *e) override | 
| virtual void | mouseDoubleClickEvent(QMouseEvent *event) override | 
| virtual void | mouseMoveEvent(QMouseEvent *event) override | 
| virtual void | mousePressEvent(QMouseEvent *event) override | 
| virtual void | mouseReleaseEvent(QMouseEvent *event) override | 
| virtual void | resizeEvent(QResizeEvent *ev) override | 
| virtual void | showEvent(QShowEvent *) override | 
| virtual void | tabletEvent(QTabletEvent *event) override | 
| virtual void | wheelEvent(QWheelEvent *event) override | 
详细说明
QQuickWindow提供与QQuickItems进行交互和显示场景所需的图形场景管理。
QQuickWindow始终只有一个不可见的根项。要将项添加到该窗口,请将该项重新设置为根项或场景中的现有项。
有关从QML文件中轻松显示场景的信息,请参阅QQuickView。
渲染
QQuickWindow使用场景图来表示需要渲染的内容。这个场景图与QML场景断开连接,并且可能生活在另一个线程中,这取决于平台实现。由于渲染场景图独立于QML场景存在,无需影响QML场景状态即可完全释放它。
当QML场景第一次渲染到屏幕上时,在渲染线程中,在渲染场景图之前发出sceneGraphInitialized()信号。如果渲染场景图已被释放,则信号将在下一帧渲染之前再次发出。一个可见的、屏幕上的QQuickWindow由内部驱动的渲染循环驱动,该循环有多个实现提供了场景图。有关场景图渲染过程的详细信息,请参阅Qt Quick Scene Graph。
默认情况下,QQuickWindow使用加速的3D图形API进行渲染,例如OpenGL或Vulkan。请参阅场景图适配以获取场景图后端和支持的图形API的概述。
警告:图形操作和与场景图的交互必须仅在第渲染线程上独家进行,主要在updatePaintNode()阶段。
警告:由于许多与渲染相关的信号都是从渲染线程发出的,因此应使用Qt::DirectConnection进行连接。
与加速3D图形API的集成
只要 QQuickWindow 和底层的场景图使用的是相同的 API,就可以将其直接整合到 OpenGL、Vulkan、Metal 或 Direct3D 11 调用中。要访问原生图形对象,如设备或上下文对象句柄,请使用 QSGRendererInterface。可以通过调用 rendererInterface() 从 QQuickWindow 查询 QSGRendererInterface 实例。此集成的启用器有 beforeRendering(),beforeRenderPassRecording(),afterRenderPassRecording() 以及相关信号。这些允许在底层或上层进行渲染。或者,QNativeInterface::QSGOpenGLTexture,QNativeInterface::QSGVulkanTexture 以及其他类似类允许将现有的原生纹理或图像对象封装在 QSGTexture 中,然后可以与场景图一起使用。
无加速渲染
还有一个有限的纯软件渲染路径可用。使用 software 后端时,一些 Qt Quick 功能不可用,依赖于这些功能的 QML 项将无法渲染。同时,这也允许 QQuickWindow 即使在没有 3D 图形 API 的系统上也能正常工作。有关更多详细信息,请参阅 Qt Quick 软件适配。
重定向渲染
QQuickWindow 不一定在屏幕上由原生窗口支持。渲染可以重定向到目标自定义渲染目标,如特定的原生纹理。这是通过结合 QQuickRenderControl 类以及 setRenderTarget(),setGraphicsDevice() 和 setGraphicsConfiguration() 等功能实现的。
在这种情况下,QQuickWindow 代表场景,并提供渲染一帧的内部结构。它不会由渲染循环和原生窗口支持。相反,在这种情况下,应用程序驱动渲染,有效地替换了渲染循环。这允许生成图像序列,将渲染输出到纹理以供外部 3D 引擎使用,或在 VR 环境中对 Qt Quick 内容进行渲染。
资源管理
QML 将尝试缓存图像和场景图节点以改善性能,但在某些低内存场景中可能需要积极地释放这些资源。可以使用 releaseResources() 函数强制清理某些资源,特别是那些可以稍后重新创建的资源。
此外,调用 releaseResources() 可能会导致整个场景图及其相关图形资源的释放。发生这种情况时,将发出 sceneGraphInvalidated() 信号。此行为受 setPersistentGraphics() 和 setPersistentSceneGraph() 函数控制。
注意:所有以 QSG 前缀命名的类都应该仅在场景图的渲染线程上使用。有关更多信息,请参阅 场景图和渲染。
曝光和可见性
当使用 hide() 或 setVisible(false) 故意隐藏 QQuickWindow 实例时,它将停止渲染,其场景图和图形上下文也可能被释放。这取决于 setPersistentGraphics() 和 setPersistentSceneGraph() 配置的设置。在这方面的表现与显式调用 releaseResources() 函数是相同的。窗口也可以通过其他方式变得不可见,也就是说无法渲染。这取决于平台和窗口系统。例如,在 Windows 上最小化窗口将使其停止渲染。在 macOS 上,被顶部的其他窗口完全遮挡的窗口也会触发同样的行为。在 Linux/X11 上,行为取决于窗口管理器。
OpenGL 上下文和表面格式
虽然可以通过调用成员函数 setFormat() 为每个 QQuickWindow 指定 QSurfaceFormat,但窗口也可以通过 QML 中的 Window 和 ApplicationWindow 元素创建。在这种情况下,没有 C++ 代码参与窗口实例的创建,但应用程序可能仍希望设置某些表面格式值,例如请求指定的 OpenGL 版本或配置文件。此类应用程序可以在启动时调用静态函数 QSurfaceFormat::setDefaultFormat()。指定的格式将用于随后创建的所有 Quick 窗口。
Vulkan 实例
当使用 Vulkan 时,QQuickWindow 会自动与由场景图内部创建和管理的 QVulkanInstance 关联。这种方式,大多数应用程序无需担心是否有可用的 VkInstance,因为所有这些操作都是自动完成的。在高级情况下,应用程序可能希望创建自己的 QVulkanInstance,以便以特定的方式进行配置。这是可以的。在将 QQuickWindow 在使其可见之前构造之后调用 setVulkanInstance(),将导致使用应用程序提供的 QVulkanInstance(以及底层的 VkInstance)。通过 QQuickRenderControl 重定向时,没有自动提供 QVulkanInstance,而是期望应用程序提供其自身的,并将其与 QQuickWindow 关联。
图形上下文和设备
在场景图初始化时,这是在窗口变得可见时通常发生的情况,或者在重定向渲染的情况下通过 QQuickRenderControl 进行初始化时执行,必要的上下文或设备对象会自动创建。这包括 OpenGL 上下文、Direct3D 设备和设备上下文、Vulkan 和 Metal 设备。应用程序代码之后也可以通过 QSGRendererInterface 查询这些。在使用执行所有渲染操作的 GUI 线程的 basic 渲染循环的情况下,相同的上下文或设备用于所有可见的 QQuickWindows。使用 threaded 渲染循环时,每个渲染线程使用一个专用的上下文或设备对象,因此为每个 QQuickWindow。在某些图形 API 中,通过 setGraphicsConfiguration 提供了一定程度的可定制性。这使您可以指定要启用的 VkDevice 上的 Vulkan 扩展列表。或者,也可以提供一组现有的上下文或设备对象供 QQuickWindow 使用,而不是让它构建自己的。这是通过 setGraphicsDevice 实现的。
相关链接 QQuickView、QQuickRenderControl、QQuickRenderTarget、QQuickGraphicsDevice、QQuickGraphicsConfiguration 和 QSGRendererInterface。
成员类型文档
枚举 QQuickWindow::CreateTextureOption
标志 QQuickWindow::CreateTextureOptions
CreateTextureOption 枚举用于自定义纹理的包裹。
| 常量 | 值 | 描述 | 
|---|---|---|
| QQuickWindow::TextureHasAlphaChannel | 0x0001 | 纹理具有alpha通道,并且应使用混合进行绘制。 | 
| QQuickWindow::TextureHasMipmaps | 0x0002 | 纹理具有mipmaps,并且可以启用mipmapping绘制。 | 
| QQuickWindow::TextureOwnsGLTexture | 0x0004 | 从Qt 6.0开始,该标志在实际中不被使用,会被忽略。原生图形资源所有权不能转移到包裹的 QSGTexture,因为Qt Quick可能没有关于如何释放此类对象及其关联内存的必要细节。 | 
| QQuickWindow::TextureCanUseAtlas | 0x0008 | 该图像可以上传到纹理图集中。 | 
| QQuickWindow::TextureIsOpaque | 0x0010 | 该纹理会对 QSGTexture::hasAlphaChannel() 返回 false,并且不会进行混合。此标志在Qt 5.6中添加。 | 
QQuickWindow::CreateTextureOptions 类型是 CreateTextureOption 的 typedef,为 QFlags<CreateTextureOption>。它存储了 CreateTextureOption 值的按位或组合。
枚举 QQuickWindow::RenderStage
| 常量 | 值 | 描述 | 
|---|---|---|
| QQuickWindow::BeforeSynchronizingStage | 0 | 同步之前。 | 
| QQuickWindow::AfterSynchronizingStage | 1 | 同步之后。 | 
| QQuickWindow::BeforeRenderingStage | 2 | 渲染之前。 | 
| QQuickWindow::AfterRenderingStage | 3 | 渲染之后。 | 
| QQuickWindow::AfterSwapStage | 4 | 交换帧之后。 | 
| QQuickWindow::NoStage | 5 | 尽可能快。此值在Qt 5.6中添加。 | 
相关链接 场景图和渲染。
枚举 QQuickWindow::SceneGraphError
此枚举描述了 sceneGraphError() 信号的错误。
| 常量 | 值 | 描述 | 
|---|---|---|
| QQuickWindow::ContextNotAvailable | 1 | 图形上下文创建失败。这通常意味着没有找到合适的OpenGL实现,例如因为没有安装图形驱动程序,所以没有OpenGL 2支持。在移动和嵌入式板上了,此类错误可能表明窗口系统集成存在问题,并可能是因为Qt配置不正确。 | 
枚举 QQuickWindow::TextRenderType
此枚举描述了 Qt Quick 中文本元素(如 Text、TextInput 等)的默认渲染类型。
选择 NativeTextRendering 如果你希望文本看起来与目标平台融为一体且不需要如文本转换等高级功能。使用这种类型与 NativeTextRendering 渲染类型结合使用,可能会产生差劣的效果,有时甚至是像素化的。
QtTextRendering 和 CurveTextRendering 都是硬件加速技术。QtTextRendering 是两者中速度更快的,但使用更多的内存,在大尺寸时可能会出现渲染伪影。CurveTextRendering 应当在 QtTextRendering 无法给出良好的视觉结果或需要降低图形内存消耗时作为一个替代选项。
| 常量 | 值 | 描述 | 
|---|---|---|
| QQuickWindow::QtTextRendering | 0 | 使用Qt自带的栅格化算法。 | 
| QQuickWindow::NativeTextRendering | 1 | 使用操作系统的原生栅格化器来渲染文本。 | 
| QQuickWindow::CurveTextRendering | 2 | 使用直接在图形硬件上运行的曲线栅格化器来渲染文本。(Qt 6.7.0版引入。) | 
属性文档
[只读] activeFocusItem : QQuickItem* const
该属性持有当前拥有活动焦点的项,如果没有具有活动焦点的项,则为null。
访问函数
| QQuickItem * | activeFocusItem() const | 
通知信号
| void | 活动焦点项目更改() | 
另请参阅QQuickItem::forceActiveFocus() 和 Qt Quick中的键盘焦点。
color : QColor
该属性用于在每一帧开始时清除颜色缓冲区的颜色。
默认情况下,清除颜色为白色。
访问函数
| QColor | color() const | 
| void | setColor(const QColor &color) | 
通知信号
| void | colorChanged(const QColor &) | 
[只读] contentItem : QQuickItem* const
该属性持有场景的无形根项。
一个 QQuickWindow 总是有一个包含其所有内容的单个无形根项。要向此窗口添加项,请将这些项重新养育到contentItem或场景中现有项。
访问函数
| QQuickItem * | contentItem() const | 
transientParent : QWindow* const
该属性表示此窗口的暂时弹出窗口的窗口。
这是向窗口管理器的一个提示,即此窗口是代表暂时父窗口的对话框或弹出窗口(可能是任何类型的QWindow)。
为了使窗口默认居中在其暂时父窗口上方,根据窗口管理器,还可能需要设置带有合适的 Qt::WindowType(如Qt::Dialog)的flags属性。
另请参阅parent。
成员函数文档
[显式] QQuickWindow::QQuickWindow(QWindow *parent = nullptr)
使用指定的父窗口parent构建用于显示QML场景的窗口。
[显式] QQuickWindow::QQuickWindow(QQuickRenderControl *control)
构建用于显示QML场景的窗口,其渲染将由control对象控制。有关更多信息,请参阅QQuickRenderControl的文档。
[重写虚函数 noexcept] QQuickWindow::~QQuickWindow()
销毁窗口。
[覆盖虚函数] QAccessibleInterface *QQuickWindow::accessibleRoot() const
返回此窗口的可访问性接口,如果无法创建此接口,则返回0。
[信号] void QQuickWindow::afterAnimating()
在请求渲染线程同步场景图之前,在GUI线程上发出此信号。
与其他类似信号不同,此信号在GUI线程上发出,而不是在渲染线程上。它可用于将外部动画系统与QML内容同步。同时这也意味着此信号不适用于触发图形操作。
[信号,自6.0起] void QQuickWindow::afterFrameEnd()
在场景图提交帧时发出此信号。在afterRendering等其他相关信号之后发出。这是在渲染帧时场景图渲染线程发出的最后一个信号。
注意:与frameSwapped不同,此信号保证在通过QQuickRenderControl重定向Qt Quick输出时也发出。
警告:此信号来自场景图渲染线程。如果您的槽函数需要在执行继续之前完成,您必须确保连接是直接的(请参阅Qt::ConnectionType)。
此函数是在Qt 6.0中引入的。
另请参阅:beforeFrameBegin() 和 rendererInterface。
[信号] void QQuickWindow::afterRenderPassRecording()
此信号在场景图记录其主要渲染通道的命令之后发出,但此通道尚未在命令缓冲区中最终完成。
此信号在afterRendering之前发出,并保证帧以及场景图主要渲染通道的记录仍然活跃。这允许在不生成单独的完整渲染通道的情况下插入命令(通常会清除附加的图像)。可以通过QSGRendererInterface查询原生图形对象。
注意:通常不能在渲染通道内排队进行资源更新(上传、复制)。因此,更复杂的用户渲染需要连接到beforeRendering() 和此信号。
警告:此信号来自场景图渲染线程。如果您的槽函数需要在执行继续之前完成,您必须确保连接是直接的(请参阅Qt::ConnectionType)。
另请参阅:rendererInterface() 和 场景图 - RHI 在 QML 下。
[信号] void QQuickWindow::afterRendering()
信号在场景图将其命令添加到命令缓冲区之后发出,该命令缓冲区尚未提交到图形队列。如果需要,连接到此信号的槽功能可以通过 QSGRendererInterface 在之前查询原生资源,例如命令缓冲区。请注意,渲染通道(或通道)在此点已经被记录,无法在场景图通道内部添加更多命令。相反,请使用 afterRenderPassRecording()。因此,与Qt 5相比,在Qt 6中此信号的使用有限。相反,通常使用 beforeRendering() 和 beforeRenderPassRecording(),或者 beforeRendering() 和 afterRenderPassRecording() 来实现自定义渲染的下层或叠加。
警告:此信号来自场景图渲染线程。如果您的槽函数需要在执行继续之前完成,您必须确保连接是直接的(请参阅Qt::ConnectionType)。
注意:当使用OpenGL时,请注意,设置OpenGL 3.x或4.x特定状态,并在返回连接的槽时将这些状态保持启用或设为非默认值可能会干扰场景图的渲染。场景图渲染时使用的 QOpenGLContext 将在信号发出时绑定。
另请参阅 rendererInterface(),Scene Graph - RHI Under QML,Scene Graph - OpenGL Under QML,Scene Graph - Metal Under QML,Scene Graph - Vulkan Under QML,以及 Scene Graph - Direct3D 11 Under QML。
[signal] void QQuickWindow::afterSynchronizing()
此信号在场景图与QML状态同步后发出。
此信号可以用于执行在调用 QQuickItem::updatePaintNode() 之后所需的准备工作,当时GUI线程仍然锁定。
当使用OpenGL时,场景图用于渲染的 QOpenGLContext 将在此点绑定。
警告:此信号来自场景图渲染线程。如果您的槽函数需要在执行继续之前完成,您必须确保连接是直接的(请参阅Qt::ConnectionType)。
警告:当使用OpenGL时,请注意,设置OpenGL 3.x或4.x特定状态,并在返回连接的槽时将这些状态保持启用或设为非默认值可能会干扰场景图的渲染。
[signal, since 6.0] void QQuickWindow::beforeFrameBegin()
此信号在场景图开始准备帧之前发出。它先于像 beforeSynchronizing()或 beforeRendering()这样的信号。这是场景图渲染线程在开始准备新帧时发出的最早的信号。
此信号对需要执行某些操作(如资源清理)的较低级别图形框架相关,在Qt Quick通过底层渲染硬件接口API启动新帧记录之前。
警告:此信号来自场景图渲染线程。如果您的槽函数需要在执行继续之前完成,您必须确保连接是直接的(请参阅Qt::ConnectionType)。
此函数是在Qt 6.0中引入的。
另请参阅 afterFrameEnd()和 rendererInterface。
[signal] void QQuickWindow::beforeRenderPassRecording()
此信号在场景图开始为主渲染通道记录命令之前发出。(层有它们自己的通道并且在发出此信号时完全记录。)在发出此信号时,渲染通道已经在命令缓冲区上激活。
这个信号比 beforeRendering() 发出稍晚,并保证了不仅帧,还包括场景图主要渲染流的记录是激活的。这允许在不需要生成完整的独立渲染流(这通常会导致清除附加的图像)的情况下插入命令。可以通过 QSGRendererInterface 查询原生图形对象。
注意:通常不能在渲染通道内排队进行资源更新(上传、复制)。因此,更复杂的用户渲染需要连接到beforeRendering() 和此信号。
警告:此信号来自场景图渲染线程。如果您的槽函数需要在执行继续之前完成,您必须确保连接是直接的(请参阅Qt::ConnectionType)。
另请参阅:rendererInterface() 和 场景图 - RHI 在 QML 下。
[信号] void QQuickWindow::beforeRendering()
该信号在完成帧的准备后发出,这意味着存在一个处于记录模式中的命令缓冲区(如有必要)。如果需要,与该信号连接的槽函数可以通过 QSGRendererInterface 查询原生资源,如之前的命令。请注意,此时主渲染流的记录尚未开始,并且在该流中添加命令是不可能的。开始一个流意味着清除颜色、深度和模板缓冲区,因此仅通过连接到该信号无法实现下层渲染。相反,应该连接到 beforeRenderPassRecording。然而,如果希望记录复制的命令类型,仍需要连接到此信号,因为这些命令不能在渲染流中排队。
警告:此信号来自场景图渲染线程。如果您的槽函数需要在执行继续之前完成,您必须确保连接是直接的(请参阅Qt::ConnectionType)。
注意:当使用OpenGL时,请注意,设置OpenGL 3.x或4.x特定状态,并在返回连接的槽时将这些状态保持启用或设为非默认值可能会干扰场景图的渲染。场景图渲染时使用的 QOpenGLContext 将在信号发出时绑定。
另请参阅 rendererInterface(),Scene Graph - RHI Under QML,Scene Graph - OpenGL Under QML,Scene Graph - Metal Under QML,Scene Graph - Vulkan Under QML,以及 Scene Graph - Direct3D 11 Under QML。
[信号] void QQuickWindow::beforeSynchronizing()
该信号在场景图与 QML 状态同步之前发出。
尽管信号从场景图渲染线程发出,但 GUI 线程将被保证阻塞,就像在 QQuickItem::updatePaintNode() 中一样。因此,在通过 Qt::DirectConnection 连接的槽或 lambda 中访问 GUI 线程数据是安全的。
该信号可用于在调用 QQuickItem::updatePaintNode 之前完成所需的任何准备工作。
当使用OpenGL时,场景图用于渲染的 QOpenGLContext 将在此点绑定。
警告:此信号来自场景图渲染线程。如果您的槽函数需要在执行继续之前完成,您必须确保连接是直接的(请参阅Qt::ConnectionType)。
警告:当使用OpenGL时,请注意,设置OpenGL 3.x或4.x特定状态,并在返回连接的槽时将这些状态保持启用或设为非默认值可能会干扰场景图的渲染。
void QQuickWindow::beginExternalCommands()
当将原始图形(OpenGL、Vulkan、Metal 等)命令与场景图渲染混合时,必须在将命令记录到用于渲染主渲染流的场景图命令缓冲区之前调用此函数。这是为了避免状态冲突。
在实际应用中,此函数通常是从连接到 beforeRenderPassRecording 或 afterRenderPassRecording 信号的槽调用的。
当记录应用到应用自己的命令缓冲区的命令(例如,由应用创建和管理的 VkCommandBuffer 或 MTLCommandBuffer + MTLRenderCommandEncoder,而不是从场景图检索)时,无需调用此函数。对于不公开原生命令缓冲区概念的图形 API(OpenGL、Direct 3D 11),beginExternalCommands() 和 endExternalCommands() 一起提供了对 Qt 5 resetOpenGLState() 函数的替代。
在 QSGRenderNode 的 render() 实现中不需要调用此函数和 endExternalCommands(),因为场景图隐式地执行渲染节点所需的所有步骤。
可以通过 QSGRendererInterface::getResource() 访问原生图形对象(例如,图形设备、命令缓冲区或编码器)。
警告: 请注意,QSGRendererInterface::CommandListResource 在 beginExternalCommands() 和 endExternalCommands 之间可能返回不同的对象。这可能在底层实现提供一个独立的二级命令缓冲区以在渲染过程中记录外部图形命令时发生。因此,在调用此函数后,一定要查询 CommandListResource。不要尝试重复使用之前的查询中的对象。
注意: 当场景图使用 OpenGL 时,请注意上下文中的 OpenGL 状态可以具有任意设置,此函数不执行任何将状态重置到默认值的操作。
另请参阅 endExternalCommands() 和 QQuickOpenGLUtils::resetOpenGLState。
[重写 虚拟 保护] void QQuickWindow::closeEvent(QCloseEvent *e)
重写: QWindow::closeEvent(QCloseEvent *ev).
QSGImageNode *QQuickWindow::createImageNode() const
创建一个简单的图像节点。当场景图未初始化时,返回值是 null。
这是直接构造 QSGSimpleTextureNode 的跨后端替代方案。
另请参阅 QSGImageNode。
QSGNinePatchNode *QQuickWindow::createNinePatchNode() const
创建一个九方块节点。当场景图未初始化时,返回值是 null。
QSGRectangleNode *QQuickWindow::createRectangleNode() const
创建一个简单的矩形节点。当场景图未初始化时,返回值是 null。
这是直接构造 QSGSimpleRectNode 的跨后端替代方案。
另请参阅 QSGRectangleNode。
[自 6.7 开始] QSGTextNode *QQuickWindow::createTextNode() const
创建一个文本节点。当场景图未初始化时,返回值是 null。
此函数是在 Qt 6.7 中引入的。
另请参阅 QSGTextNode。
QSGTexture *QQuickWindow::createTextureFromImage(const QImage &image, QQuickWindow::CreateTextureOptions options) const
从提供的 image 创建一个新的 QSGTexture。如果图像具有 Alpha 通道,则相应的纹理将具有 Alpha 通道。
函数的调用者负责删除返回的纹理。然后将底层的本地纹理对象与 QSGTexture 一起销毁。
当 options 包含 TextureCanUseAtlas 时,引擎可能会将图像放入纹理图集中。图集中的纹理需要依赖 QSGTexture::normalizedTextureSubRect() 来确定其几何形状,并且不支持 QSGTexture::Repeat。其他 CreateTextureOption 的值被忽略。
当options包含TextureIsOpaque时,引擎将创建一个RGB纹理,该纹理对于QSGTexture::hasAlphaChannel返回false。在不透明纹理的情况下,渲染通常更快。如果此标志未设置,则纹理将基于图像的格式具有一个alpha通道。
当options包含TextureHasMipmaps时,引擎将创建一个可以用于mipmap过滤的纹理。mipmap纹理不能在纹理图集中使用。
在options中设置TextureHasAlphaChannel对此函数没有意义,因为假设整数通道和混合是默认的。要取消选择,设置TextureIsOpaque。
当场景图使用OpenGL时,返回的纹理将采用GL_TEXTURE_2D作为纹理目标,GL_RGBA作为内部格式。在其他图形API中,纹理格式通常是RGBA8。重新实现QSGTexture以创建具有不同参数的纹理。
警告:如果场景图尚未初始化,此函数将返回0。
警告:返回的纹理不是由场景图管理的内存,必须在渲染线程上显式由调用者删除。这可以通过从QSGNode析构函数中删除纹理或使用deleteLater()来实现,在这种情况下,如果纹理已经与渲染线程具有亲和力,则使用deleteLater()。
此函数可以从主线程和渲染线程调用。
另请参阅:sceneGraphInitialized()和QSGTexture。
QSGTexture *QQuickWindow::createTextureFromImage(const QImage &image) const
这是一个重载函数。
[since 6.6] QSGTexture *QQuickWindow::createTextureFromRhiTexture(QRhiTexture *texture, QQuickWindow::CreateTextureOptions options = {}) const
从提供的texture创建一个新的QSGTexture。
使用options来自定义纹理属性。该函数只考虑TextureHasAlphaChannel标志。如果设置,则场景图渲染器始终将结果QSGTexture作为需要混合处理处理。对于完全不透明的纹理,如果未设置标志,可以在渲染过程中节省执行alpha混合的成本。该标志与格式没有直接对应关系,即在具有诸如常用QRhiTexture::RGBA8之类的纹理格式的纹理上不设置标志是完全正常的。
由于texture已经创建且包含mipmap的存在与否,因此不会由options控制mipmap。
返回的QSGTexture拥有QRhiTexture,这意味着texture将与返回的QSGTexture一起被销毁。
如果纹理拥有其底层的本地图形资源(OpenGL纹理对象、Vulkan图像等),这取决于QRhiTexture是如何创建的(QRhiTexture::create()或QRhiTexture::createFrom()),并且此函数无法控制或更改。
注意: 仅在场景图已初始化并正在使用默认的、基于QRhi的适配时才具备功能。否则,返回值是nullptr。
注意: 此函数只能在工作在场景图渲染线程上调用。
此功能自Qt 6.6版引入。
另请参阅 createTextureFromImage、sceneGraphInitialized和QSGTexture。
qreal QQuickWindow::effectiveDevicePixelRatio() const
返回此窗口的设备像素比。
这与QWindow::devicePixelRatio() 不同,因为它支持通过QQuickRenderControl和QQuickRenderTarget进行重定向渲染。在使用QQuickRenderControl时,QQuickWindow通常并未完全创建,这意味着它从未被显示,在窗口系统中也没有创建底层本机窗口。因此,查询诸如设备像素比之类的属性无法给出正确的结果。此函数考虑了QQuickRenderControl::renderWindowFor()和QQuickRenderTarget::devicePixelRatio。当没有重定向作用时,结果与QWindow::devicePixelRatio相同。
另请参阅 QQuickRenderControl、QQuickRenderTarget、setRenderTarget和QWindow::devicePixelRatio。
void QQuickWindow::endExternalCommands()
在混合原生图形命令(OpenGL、Vulkan、Metal等)与场景图渲染时,需要在将命令记录到场景图用于渲染主渲染流的命令缓冲区之后调用此函数。这是为了避免混淆状态。
在实际应用中,此函数通常是从连接到 beforeRenderPassRecording 或 afterRenderPassRecording 信号的槽调用的。
当将命令记录到应用程序自己的命令缓冲区(例如,由应用程序创建和管理的VkCommandBuffer或MTLCommandBuffer + MTLRenderCommandEncoder)时,不需要调用此函数。在 OpenGL、Direct 3D 11 等未公开原生命令缓冲区概念的图形 API 中,beginExternalCommands()和endExternalCommands()一起提供了Qt 5 resetOpenGLState()函数的替代方案。
由于场景图会对渲染节点隐式执行必要步骤,因此在render()实现的QSGRenderNode中调用此函数和beginExternalCommands()是不必要的。
另请参阅 beginExternalCommands和QQuickOpenGLUtils::resetOpenGLState。
[覆盖虚受保护] bool QQuickWindow::event(QEvent *event)
重新实现:QWindow::event(QEvent *ev)。
[覆盖虚保护] void QQuickWindow::exposeEvent(QExposeEvent *)
重实现了:QWindow::exposeEvent(QExposeEvent *ev).
[覆盖虚保护] void QQuickWindow::focusInEvent(QFocusEvent *ev)
重实现了:QWindow::focusInEvent(QFocusEvent *ev).
[覆盖虚保护] void QQuickWindow::focusOutEvent(QFocusEvent *ev)
重实现了:QWindow::focusOutEvent(QFocusEvent *ev).
[信号] void QQuickWindow::frameSwapped()
当已为呈现准备帧时,将发出此信号。启用垂直同步时,在连续动画场景中,信号最多在每个垂直同步间隔内发出一次。
此信号将从场景图渲染线程发出。
QImage QQuickWindow::grabWindow()
捕获窗口内容并返回为图像。
可以在窗口不可见时调用 grabWindow() 函数。这要求窗口已 创建 具有有效的大小,并且没有其他 QQuickWindow 实例在同一进程中渲染。
注意:使用此窗口结合 QQuickRenderControl 时,除非使用 软件 后端,否则此函数的结果将是空图像。这是因为当通过使用 QQuickRenderControl 和 setRenderTarget() 将输出重定向到应用程序管理的图形资源(例如,纹理)时,应用程序更适合管理并执行可能发生的读取操作,因为起初它就完全控制了该资源。
警告:调用此函数将导致性能问题。
警告:此函数只能从 GUI 线程调用。
[静态,自 6.0 版起] QSGRendererInterface::GraphicsApi QQuickWindow::graphicsApi()
返回在当前时间点初始化场景图时将使用的图形 API。
查询场景图使用的 API 的标准方法是在场景图初始化后使用 QSGRendererInterface::graphicsApi(),例如在 sceneGraphInitialized() 信号发出时或之后。在这种情况下,可以得到真正的、真实的结果,因为那时将知道使用该图形 API 已正确初始化了所有内容。
这并不总是方便的。如果应用程序需要在设置外部框架或需要与 setGraphicsDevice() 以方式如场景图内置 API 选择逻辑依存的方式工作时,并不是在所有情况下都能在实际将操作推迟到 QQuickWindow 已可见之后或 QQuickRenderControl::initialize() 调用时才执行这些操作。
因此,这个静态函数作为 setGraphicsApi() 的对应物提供:它可以随时调用,结果反映场景图在调用点初始化时会选择的 API。
注意:这个静态函数仅应在主(GUI)线程上调用。在渲染时查询 API,请使用 QSGRendererInterface,因为该对象位于渲染线程。
注意:此函数不考虑场景图后端。
此函数是在Qt 6.0中引入的。
另请参阅:setGraphicsApi。
[since 6.0] QQuickGraphicsConfiguration QQuickWindow::graphicsConfiguration() const
返回传递给 setGraphicsDevice() 的 QQuickGraphicsDevice,否则返回默认构造的实例。
此函数是在Qt 6.0中引入的。
另请参阅:setGraphicsConfiguration。
[since 6.0] QQuickGraphicsDevice QQuickWindow::graphicsDevice() const
返回传递给 setGraphicsDevice() 的 QQuickGraphicsDevice,否则返回默认构造的实例。
此函数是在Qt 6.0中引入的。
另请参阅:setGraphicsDevice。
const QQuickWindow::GraphicsStateInfo &QQuickWindow::graphicsStateInfo()
返回对描述 RHI 部分内部状态的 GraphicsStateInfo 结构的引用,特别是后端(如 Vulkan 或 Metal 集成)的双缓存或三缓存状态。当底层图形 API 是 Vulkan 或 Metal,并且外部渲染代码希望对频繁更改的资源(如均匀缓冲区)进行双缓存或三缓存以避免管道停滞时,这很重要。
[static] bool QQuickWindow::hasDefaultAlphaBuffer()
返回是否对新创建的窗口使用 alpha 透明度。
[override virtual protected] void QQuickWindow::hideEvent(QHideEvent *)
重实现了 QWindow::hideEvent(QHideEvent *ev)。
QQmlIncubationController *QQuickWindow::incubationController() const
返回一个在帧之间为本窗口拼接孵化的孵化控制器。 QQuickView 会自动为您安装此控制器,否则您需要使用 QQmlEngine::setIncubationController() 自己安装。
控制器归窗口所有,将在删除窗口时销毁。
bool QQuickWindow::isPersistentGraphics() const
返回是否可以在 QQuickWindow 生命期内释放基本图形资源。
注意:这是一个提示,并不能保证它会被考虑。
另请参阅:setPersistentGraphics。
bool QQuickWindow::isPersistentSceneGraph() const
在 QQuickWindow 的生命周期内,返回场景图节点和资源是否可以释放。
注意:这是一个提示。何时以及如何发生是具体实现的而不是标准的。
bool QQuickWindow::isSceneGraphInitialized() const
如果场景图已初始化,返回 true;否则返回 false。
[重写虚拟受保护] void QQuickWindow::keyPressEvent(QKeyEvent *e)
重写自:QWindow::keyPressEvent(QKeyEvent *ev)。
[重写虚拟受保护] void QQuickWindow::keyReleaseEvent(QKeyEvent *e)
重写自:QWindow::keyReleaseEvent(QKeyEvent *ev)。
[重写虚拟受保护] void QQuickWindow::mouseDoubleClickEvent(QMouseEvent *event)
重写自:QWindow::mouseDoubleClickEvent(QMouseEvent *ev)。
[重写虚拟受保护] void QQuickWindow::mouseMoveEvent(QMouseEvent *event)
重写自:QWindow::mouseMoveEvent(QMouseEvent *ev)。
[重写虚拟受保护] void QQuickWindow::mousePressEvent(QMouseEvent *event)
重写自:QWindow::mousePressEvent(QMouseEvent *ev)。
[重写虚拟受保护] void QQuickWindow::mouseReleaseEvent(QMouseEvent *event)
重写自:QWindow::mouseReleaseEvent(QMouseEvent *ev)。
[slot] void QQuickWindow::releaseResources()
此函数尝试释放 QML 场景当前持有的冗余资源。
调用此函数会要求场景图释放缓存的图形资源,例如图形管线对象、着色器程序或图像数据。
此外,根据所使用的渲染循环,此函数还可能导致场景图和所有窗口相关的渲染资源被释放。如果发生这种情况,将发出 sceneGraphInvalidated() 信号,允许用户清理他们自己的图形资源。可以使用 setPersistentGraphics() 和 setPersistentSceneGraph() 函数来防止这种情况发生,但如果在应用程序中处理清理不可行,则这将导致更高的内存使用。
注意:缓存的图形资源,如图形管线或着色器程序的释放,不依赖于持久性提示。无论持久图形和场景图提示的值如何,都会释放这些资源。
注意:此函数与 QQuickItem::releaseResources() 虚拟函数无关。
另请参阅 sceneGraphInvalidated(),setPersistentGraphics() 和 setPersistentSceneGraph()。
[自 6.0 开始] QQuickRenderTarget QQuickWindow::renderTarget() const
返回传递给 setRenderTarget() 的 QQuickRenderTarget,或者如果没有提供,则返回一个默认构造的实例
此函数是在Qt 6.0中引入的。
另请参阅 setRenderTarget()。
QSGRendererInterface *QQuickWindow::rendererInterface() const
返回当前的渲染器接口。这个值始终有效,绝不会为 null。
注意: 可以在构造完 QQuickWindow 后的任何时候调用此函数,即使 isSceneGraphInitialized() 仍然为 false。然而,某些渲染器接口函数,特别是 QSGRendererInterface::getResource(),直到场景图启动才可用。另一方面,后端查询,如 QSGRendererInterface::graphicsApi() 或 QSGRendererInterface::shaderType() 总是可用。
注意: 返回的指针的所有权属于 Qt。返回的实例可能或可能不在不同 QQuickWindow 实例之间共享,具体取决于所使用的场景图后端。因此,应用程序应查询每个 QQuickWindow 的接口对象,而不是重复使用已查询的指针。
另请参阅 QSGRenderNode 和 QSGRendererInterface。
[重写虚受保护] void QQuickWindow::resizeEvent(QResizeEvent *ev)
重实现:QWindow::resizeEvent(QResizeEvent *ev)。
[自 6.6 开始] QRhi *QQuickWindow::rhi() const
返回此窗口用于渲染的 QRhi 对象。
仅当窗口使用 Qt 的 3D API 和着色语言抽象时才可用,这意味着当使用 软件 适配时,结果始终为 null。
结果仅在渲染已初始化时才有效,这通过发射 sceneGraphInitialized() 信号来指示。在此之前,返回的值是 null。对于屏幕上的常规 QQuickWindow,场景图初始化通常发生在原生窗口第一次曝光(显示)时。当使用 QQuickRenderControl 时,初始化是在显式的 initialize() 调用中完成的。
实际上,这个函数是查询 QRhi 的快捷方式QSGRendererInterface。
此功能自Qt 6.6版引入。
[信号] void QQuickWindow::sceneGraphAboutToStop()
当场景图即将停止渲染时,在渲染线程上发出此信号。这通常是因为窗口已被隐藏。
应用程序可能使用此信号释放资源,但应该准备好快速重新实例化它们。此时并不释放场景图和图形上下文。
警告:此信号来自场景图渲染线程。如果您的槽函数需要在执行继续之前完成,您必须确保连接是直接的(请参阅Qt::ConnectionType)。
警告:请务必确保sceneGraphAboutToStop()的信号处理器将图形上下文保留在进入信号处理器时的相同状态。否则可能导致场景无法正确渲染。
另请参阅sceneGraphInvalidated()。
[static] QString QQuickWindow::sceneGraphBackend()
返回请求的Qt Quick场景图后端。
注意:在应用程序中第一个QQuickWindow构造之前,此函数的返回值可能仍然被后续调用setSceneGraphBackend()所更新。
注意:此值仅反映在构造了QQuickWindow之后环境变量QT_QUICK_BACKEND中的请求。
另请参阅setSceneGraphBackend()。
[signal] void QQuickWindow::sceneGraphError(QQuickWindow::SceneGraphError error, const QString &message)
场景图初始化过程中发生错误时发出此信号。
如果应用程序想以自定义方式处理错误,如图形上下文创建失败,则应连接到此信号。如果没有槽连接到信号,则将执行不同的操作:Quick将打印消息或显示消息框,并终止应用程序。
此信号将从GUI线程发出。
[signal] void QQuickWindow::sceneGraphInitialized()
场景图初始化时发出此信号。
此信号将从场景图渲染线程发出。
[signal] void QQuickWindow::sceneGraphInvalidated()
场景图失效时发出此信号。
此信号暗示所使用的图形渲染上下文已经失效,并且所有与该上下文相关联的用户资源都应该被释放。
使用OpenGL进行渲染时,当调用此函数时,此窗口的QOpenGLContext将被绑定。唯一的例外是如果在Qt的控制之外销毁了原生OpenGL,例如通过EGL_CONTEXT_LOST。
此信号将从场景图渲染线程发出。
void QQuickWindow::scheduleRenderJob(QRunnable *job, QQuickWindow::RenderStage stage)
将任务job安排在达到指定的stage时运行。
这是对QQuickWindow中类似信号的便利,用于“一次”任务。
窗口将拥有job的所有权,并在作业完成后删除它。
如果在job有机会运行之前关闭了渲染,则作业将被运行并随后删除,作为场景图清理的一部分。如果在QQuickWindow被销毁之前没有显示窗口且没有渲染发生,所有挂起的作业将在run()方法未被调用的情况下被销毁。
如果渲染在不同的线程上执行,则作业将在渲染线程上发生。
如果 阶段 是 无阶段,作业 将在渲染线程不忙于渲染帧时尽可能早地运行。如果在作业提交或处理时窗口未公开,并且无法渲染,作业将被删除而不会执行 run() 方法。如果使用的是非线程渲染器,作业的 run() 方法将同步执行。当使用 OpenGL 进行渲染时,在执行任何作业之前(包括 无阶段 作业),OpenGL 上下文将更改为渲染器的上下文。
注意:此函数不会触发渲染;针对除 无阶段 以外的任何阶段的作业将被存储起来,直到在别处触发渲染。要强制作业尽早运行,请调用 QQuickWindow::update();
另请参阅beforeRendering,afterRendering,beforeSynchronizing,afterSynchronizing,frameSwapped,以及 sceneGraphInvalidated。
[静态] void QQuickWindow::setDefaultAlphaBuffer(bool useAlpha)
useAlpha 指定是否在新创建的窗口上使用 alpha 透明度。
在期望创建半透明窗口的任何应用程序中,在创建第一个 QQuickWindow 之前设置此属性为 true 是必要的。默认值为 false。
[静态,自 6.0 版起] void QQuickWindow::setGraphicsApi(QSGRendererInterface::GraphicsApi api)
请求指定的图形 api。
当使用内置的默认图形适配器时,api 指定场景图应使用哪个图形 API(OpenGL、Vulkan、Metal 或 Direct3D)进行渲染。此外,还包括内置的 software 后端,可以通过将 api 设置为 QSGRendererInterface::Software 来请求。
与 setSceneGraphBackend 不同,后者只能用于请求特定的后端(无论是内置的还是作为动态加载的插件安装的),此函数与更高级别的图形 API 概念一起工作。它覆盖了与 Qt Quick 一起提供的后端,并且因此在 QSGRendererInterface::GraphicsApi 枚举中具有相应的值。
如果没有调用此函数,并且相应的环境变量 QSG_RHI_BACKEND 也没有设置,则场景图将根据平台选择要使用的图形 API。
此函数在仅准备使用特定 API 进行渲染的应用程序中变得非常重要。例如,如果应用程序中已经进行了原生的 OpenGL 或 Vulkan 渲染,它将希望确保 Qt Quick 也使用 OpenGL 或 Vulkan 进行渲染。这样的应用程序预计会尽早在其 main() 函数中调用此函数。
注意:必须在构造应用程序中的第一个 QQuickWindow 之前调用此函数。之后无法更改图形 API。
注意:与 QQuickRenderControl 结合使用时,此规则放宽了:可以更改图形 API,但仅在所有现有的 QQuickRenderControl 和 QQuickWindow 实例被销毁后。
要查询场景图使用哪个图形API进行渲染,场景图�始化后调用QSGRendererInterface::graphicsApi(),这通常发生在窗口首次可见时,或调用QQuickRenderControl::initialize()之后。
要切换回默认行为,即场景图根据平台和其他条件选择图形API,将api设置为QSGRendererInterface::Unknown。
此函数是在Qt 6.0中引入的。
另请参阅graphicsApi。
[since 6.0] void QQuickWindow::setGraphicsConfiguration(const QQuickGraphicsConfiguration &config)
设置此窗口的图形配置。参数config包含场景图在初始化底层图形设备和上下文时可能考虑的设置。
类似的附加配置,例如指定要对Vulkan启用的设备扩展,在集成依赖于某些扩展的本地图形渲染代码时变得相关和关键。与外部3D或VR引擎(如OpenXR)集成时也是如此。
注意:通过setGraphicsDevice()采用现有图形设备时,配置将被忽略,因为此时场景图不控制那些对象的实际构建。
QQuickGraphicsConfiguration实例隐式共享,是可复制的,并且可以按值传递。
警告:必须在场景图为此窗口首次初始化之前及尽早设置QQuickGraphicsConfiguration。对于屏幕窗口,这意味着在调用show()在QQuickWindow或QQuickView上之前执行调用。对于QQuickRenderControl,必须在调用initialize()之前最终确定配置。
此函数是在Qt 6.0中引入的。
[since 6.0] void QQuickWindow::setGraphicsDevice(const QQuickGraphicsDevice &device)
设置此窗口的图形设备对象。场景图将使用由device指定的现有设备、物理设备和其他对象,而不是创建新对象。
此函数通常与QQuickRenderControl和setRenderTarget()一起使用,以便将Qt Quick渲染重定向到纹理。
默认构造的QQuickGraphicsDevice不会以任何方式改变默认行为。一旦通过QQuickGraphicsDevice的某个工厂函数(例如QQuickGraphicsDevice::fromDeviceObjects)创建并传递给场景图使用匹配的图形API(例如,fromDeviceObjects()的示例将是Vulkan),场景图将使用QQuickGraphicsDevice封装的现有设备对象(例如,Vulkan中的VkPhysicalDevice、VkDevice以及图形队列家族索引)。这允许使用相同的设备,并因此共享资源,如缓存和纹理,在Qt Quick和本地渲染引擎之间。
警告:此函数只能在初始化场景图之前调用,如果在之后调用则没有效果。在实践中,这通常意味着在调用QQuickRenderControl::initialize()之前调用它。
以下以Direct3D为例,典型的使用方法是:
// native graphics resources set up by a custom D3D rendering engine ID3D11Device *device; ID3D11DeviceContext *context; ID3D11Texture2D *texture; ... // now to redirect Qt Quick content into 'texture' we could do the following: QQuickRenderControl *renderControl = new QQuickRenderControl; QQuickWindow *window = new QQuickWindow(renderControl); // this window will never be shown on-screen ... window->setGraphicsDevice(QQuickGraphicsDevice::fromDeviceAndContext(device, context)); renderControl->initialize(); window->setRenderTarget(QQuickRenderTarget::fromD3D11Texture(texture, textureSize); ...
使用此函数的关键是确保资源或资源句柄,如上面示例中的纹理,对外部渲染引擎和场景图渲染器都是可见和可用的。这需要使用相同的图形设备(或在OpenGL中,OpenGL上下文)。
QQuickGraphicsDevice 实例隐式共享,可复制,可以通过值传递。它们不拥有关联的原生对象(例如,示例中的ID3D11Device)。
注意:使用 QQuickRenderControl 并不总是意味着需要调用此函数。当不需要采用现有设备或上下文时,不应调用此函数,此时场景图将正常初始化其自身的设备和服务,就像在屏幕上的 QQuickWindow 一样。
此函数是在Qt 6.0中引入的。
另请参阅:graphicsDevice()、QQuickRenderControl、setRenderTarget() 和 setGraphicsApi()。
void QQuickWindow::setPersistentGraphics(bool persistent)
设置图形资源(图形设备或上下文、swapchain、缓冲区、纹理)是否应保留,不能直到最后一个窗口被删除前释放,到 persistent。默认值是 true。
在调用 releaseResources() 或窗口被隐藏(更具体地说,不可渲染)时,一些渲染循环可能会释放所有资源,而不仅仅是对缓存资源的释放。这可能会暂时释放内存,但也意味着渲染引擎在窗口需要再次渲染时将必须进行完整的、可能代价高昂的资源重新初始化。
注意:窗口不可渲染的规则是平台和窗口管理器特定的。
注意:当最后一个 QQuickWindow 被删除时,将释放所有图形资源,无论此设置如何。
注意:这是一个提示,并不能保证它会被考虑。
注意:此提示不适用于缓存资源,丢弃并稍后重新创建它们相对便宜。因此,调用 releaseResources() 通常会导致释放这些资源,无论此提示的值如何。
另请参阅:isPersistentGraphics()、setPersistentSceneGraph()、sceneGraphInitialized()、sceneGraphInvalidated() 和 releaseResources()。
void QQuickWindow::setPersistentSceneGraph(bool persistent)
设置场景图节点和资源是否 persistent。持久性意味着节点和资源不能被释放。默认值是 true。
当调用 releaseResources()、窗口被隐藏(更具体地说,不可渲染)时,一些渲染循环有释放场景图节点和相关图形资源的机会。这可能会暂时释放内存,但这也意味着窗口下次渲染时将需要重建场景图。
注意:窗口不可渲染的规则是平台和窗口管理器特定的。
注意:无论此设置如何,场景图节点和资源总是在最后一个 QQuickWindow 被删除时释放。
注意:这是一个提示,并不能保证它会被考虑。
另请参阅:isPersistentSceneGraph()、setPersistentGraphics()、sceneGraphInvalidated()、sceneGraphInitialized() 和 releaseResources()。
[自6.0起] void QQuickWindow::setRenderTarget(const QQuickRenderTarget &target)
设置此窗口的渲染目标为target。
QQuickRenderTarget用于表示可渲染的原生对象(通常是二维纹理和相关的属性,例如像素大小)的一个不透明句柄。
默认构造的QQuickRenderTarget表示没有重定向。另一方面,通过QQuickRenderTarget的静态工厂函数之一创建的有效target,可以启用Qt Quick场景的重定向:它将不再针对与窗口关联的颜色缓冲区,而是针对target中指定的纹理或其他图形对象。
例如,假设场景图使用Vulkan进行渲染,可以将输出重定向到VkImage。对于像Vulkan这样的图形API,还必须提供图像布局。QQuickRenderTarget实例隐式共享且可复制,可以通过值传递。然而,它们并不拥有相关联的原生对象(例如示例中的VkImage)。
QQuickRenderTarget rt = QQuickRenderTarget::fromVulkanImage(vulkanImage, VK_IMAGE_LAYOUT_PREINITIALIZED, pixelSize); quickWindow->setRenderTarget(rt);
此函数通常与QQuickRenderControl和一个不可见的QQuickWindow结合使用,以便将Qt Quick内容渲染到纹理中,而不为此QQuickWindow创建屏幕上的原生窗口。
当所需的或相关数据(如大小)更改时,请使用新QQuickRenderTarget调用此函数。构造QQuickRenderTarget实例和调用此函数的成本很低,但请注意,当场景图要渲染下一帧时,设置具有不同原生对象或其他数据的新的 target 可能会导致潜在的昂贵初始化步骤。因此,仅在必要时更改 target。
注意:窗口不会获取target中引用的任何原生对象的所有权。
注意:调用者负责确保target中引用的原生对象对场景图渲染器也是有效的。例如,对于Vulkan、Metal和Direct3D,这意味着纹理或图像是在场景图内部使用的相同图形设备上创建的。因此,当涉及在现有设备或上下文中创建的纹理对象时,此功能通常与setGraphicsDevice结合使用。
注意:在涉及相关图形API的情况下,应用程序必须注意场景图执行图像布局转换。例如,一旦通过调用此函数将VkImage与场景图关联起来,当渲染帧时,其布局将转换为VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL。
警告:此函数只能从执行渲染的线程中调用。
此函数是在Qt 6.0中引入的。
另请参阅renderTarget()、QQuickRenderControl、setGraphicsDevice()和setGraphicsApi。
[静态] void QQuickWindow::setSceneGraphBackend(const QString &backend)
请求Qt Quick场景图的backend。后端可以是内置的,也可以是以动态加载插件的形式安装的。
这是一个重载函数。
注意:必须在构造应用程序中的第一个QQuickWindow之前调用此函数。之后无法更改。
请参阅在您的应用中切换适配,获取关于后端列表的更多信息。如果后端无效或发生错误,则请求将被忽略。
注意: 调用此函数等同于设置QT_QUICK_BACKEND或QMLSCENE_DEVICE环境变量。然而,由于无需担心环境继承,此API在创建其他进程的应用中更安全。
另请参阅 sceneGraphBackend().
[静态] void QQuickWindow::setTextRenderType(QQuickWindow::TextRenderType renderType)
将Qt Quick中文本的默认渲染类型设置为renderType。
注意: 设置渲染类型只会影响之后创建的元素;现有元素的渲染类型将不会修改。
另请参阅 textRenderType().
[重载虚保护] void QQuickWindow::showEvent(QShowEvent *)
重新实现:QWindow::showEvent(QShowEvent *ev).
[自 6.6 起存在] QRhiSwapChain *QQuickWindow::swapChain() const
返回此窗口使用的QRhiSwapChain,如果有。
注意: 只有由标准渲染循环(如basic或threaded)支持的屏幕窗口才会有swapchain。否则返回值将为null。例如,当窗口与QQuickRenderControl一起使用时,结果始终为null。
此功能自Qt 6.6版引入。
[重载虚保护] void QQuickWindow::tabletEvent(QTabletEvent *event)
重新实现:QWindow::tabletEvent(QTabletEvent *ev).
[静态] QQuickWindow::TextRenderType QQuickWindow::textRenderType()
返回Qt Quick中文本的渲染类型。默认为QQuickWindow::QtTextRendering。
另请参阅 setTextRenderType().
[槽] void QQuickWindow::update()
安排窗口渲染另一帧。
调用QQuickWindow::update()与QQuickItem::update()不同,无论底层场景图是否发生变化,它都会触发重绘。
[重载虚保护] void QQuickWindow::wheelEvent(QWheelEvent *event)
重新实现:QWindow::wheelEvent(QWheelEvent *ev).
© 2024 Qt公司有限公司。本文档中包含的文档贡献为各自所有者的版权。本提供的文档受免费软件基金会发布的GNU自由文档许可证第1.3版条款许可。Qt及其相应标志为芬兰及其它国家和地区Qt公司有限公司的商标。所有其他商标均为其各自所有者的财产。