QQuickWindow Class

QQuickWindow 类提供了显示图形化 QML 场景的窗口。更多

Header: #include <QQuickWindow>
CMake: find_package(Qt6 REQUIRED COMPONENTS Quick)
target_link_libraries(mytarget PRIVATE Qt6::Quick)
qmake: QT += quick
在 QML 中: Window
继承: QWindow
继承于:

QQuickView

公共类型

struct GraphicsStateInfo
enum CreateTextureOption { TextureHasAlphaChannel, TextureHasMipmaps, TextureOwnsGLTexture, TextureCanUseAtlas, TextureIsOpaque }
flags CreateTextureOptions
enum RenderStage { BeforeSynchronizingStage, AfterSynchronizingStage, BeforeRenderingStage, AfterRenderingStage, AfterSwapStage, NoStage }
enum SceneGraphError { ContextNotAvailable }
enum TextRenderType { QtTextRendering, NativeTextRendering, CurveTextRendering }

属性

公共函数

QQuickWindow(QQuickRenderControl *control)
QQuickWindow(QWindow *parent = nullptr)
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 endExternalCommands()
QImage grabWindow()
(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 releaseResources()
void update()

信号

void activeFocusItemChanged()
void afterAnimating()
(since 6.0) void afterFrameEnd()
void afterRenderPassRecording()
void afterRendering()
void afterSynchronizing()
(since 6.0) void beforeFrameBegin()
void beforeRenderPassRecording()
void beforeRendering()
void beforeSynchronizing()
void colorChanged(const QColor &)
void frameSwapped()
void sceneGraphAboutToStop()
void sceneGraphError(QQuickWindow::SceneGraphError error, const QString &message)
void sceneGraphInitialized()
void sceneGraphInvalidated()

静态公共成员

(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 场景的状态。

sceneGraphInitialized() 信号是在 QML 场景第一次渲染到屏幕之前,在渲染线程上发出的。如果渲染场景图已被释放,该信号将在下一帧渲染前再次发出。屏幕上可见的 QQuickWindow 由render loop 内部驱动,场景图中提供了多种实现方式。有关场景图渲染过程的详情,请参阅Qt Quick 场景图

默认情况下,QQuickWindow 使用加速的 3D 图形 API(如 OpenGL 或 Vulkan)进行渲染。有关场景图后端和支持的图形 API 的详细概述,请参见场景图适配

警告: 图形操作和与场景图的交互必须完全在渲染线程上进行,主要是在 updatePaintNode() 阶段。

警告 由于许多与渲染相关的信号都是从渲染线程发出的,因此应使用Qt::DirectConnection 进行连接。

与加速 3D 图形 API 集成

只要 QQuickWindow 和底层场景图使用相同的 API 进行渲染,就有可能将 OpenGL、Vulkan、Metal 或 Direct3D 11 调用直接集成到 QQuickWindow 中。要访问本地图形对象,如设备或上下文对象句柄,可使用QSGRendererInterface 。通过调用rendererInterface() 可以从 QQuickWindow 中查询QSGRendererInterface 的实例。这种集成的使能器是beforeRendering(),beforeRenderPassRecording(),afterRenderPassRecording() 和相关信号。这些信号允许渲染底层或覆盖层。另外,QNativeInterface::QSGOpenGLTextureQNativeInterface::QSGVulkanTexture 和其他类似类允许在QSGTexture 中封装现有的本地纹理或图像对象,然后将其与场景图一起使用。

无加速的渲染

还有一种有限的纯软件渲染途径。有了software 后端,许多Qt Quick 功能都不可用,依赖这些功能的 QML 项目根本不会被渲染。同时,即使在没有 3D 图形 API 的系统上,QQuickWindow 也能正常运行。更多详情,请参阅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 ,但也可以通过使用 Window 和ApplicationWindow 元素从 QML 创建窗口。在这种情况下,窗口实例的创建不涉及 C++ 代码,但应用程序仍可能希望设置某些表面格式值,例如要求指定 OpenGL 版本或配置文件。此类应用程序可在启动时调用静态函数QSurfaceFormat::setDefaultFormat() 。之后创建的所有快速窗口都将使用指定的格式。

Vulkan 实例

使用 Vulkan 时,QQQuickWindow 会自动与QVulkanInstance 关联,后者由场景图在内部创建和管理。这样,大多数应用程序就无需担心VkInstance 的可用性,因为这一切都是自动完成的。在高级情况下,应用程序可能希望创建自己的QVulkanInstance ,以便以特定方式配置。这也是可能的。在构建 QQuickWindow 后,在使其可见之前,立即调用setVulkanInstance() 会导致使用应用程序提供的QVulkanInstance (以及底层的VkInstance )。当通过QQuickRenderControl 重定向时,不会自动提供QVulkanInstance ,而是期望应用程序提供自己的 ,并将其与 QQuickWindow 关联。

图形上下文和设备

当场景图被初始化时(通常发生在窗口被暴露时),或者在重定向渲染的情况下,初始化被执行via QQuickRenderControl ,渲染所需的上下文或设备对象会被自动创建。这包括 OpenGL 上下文、Direct3D 设备和设备上下文、Vulkan 和 Metal 设备。之后,应用代码还可通过QSGRendererInterface 查询这些对象。当使用basic 渲染循环(在图形用户界面线程上执行所有渲染)时,所有可见的 QQuickWindows 都使用相同的上下文或设备。threaded 渲染循环为每个渲染线程使用专用上下文或设备对象,因此也为每个 QQuickWindow 使用专用上下文或设备对象。对于某些图形应用程序接口,可通过setGraphicsConfiguration() 进行一定程度的自定义。例如,这使得在VkDevice 上指定要启用的 Vulkan 扩展列表成为可能。或者,也可以提供一组现有的上下文或设备对象供 QQuickWindow 使用,而不是让它自行构建。这可以通过setGraphicsDevice() 来实现。

另请参阅 QQuickView,QQuickRenderControl,QQuickRenderTarget,QQuickGraphicsDevice,QQuickGraphicsConfigurationQSGRendererInterface

成员类型文档

枚举 QQuickWindow::CreateTextureOption
标志 QQuickWindow::CreateTextureOptions

CreateTextureOption 枚举用于自定义纹理包装。

常数说明
QQuickWindow::TextureHasAlphaChannel0x0001纹理具有 alpha 通道,应使用混合绘制。
QQuickWindow::TextureHasMipmaps0x0002纹理具有 mipmaps,可以启用 mipmapping 绘制。
QQuickWindow::TextureOwnsGLTexture0x0004从 Qt 6.0 开始,该标记将被忽略,不会被实际使用。本地图形资源的所有权不能转让给包装QSGTexture ,因为Qt Quick 可能没有关于如何释放此类对象和相关内存的必要细节。
QQuickWindow::TextureCanUseAtlas0x0008图像可以上载到纹理图集中。
QQuickWindow::TextureIsOpaque0x0010QSGTexture::hasAlphaChannel() 中,纹理将返回 false,并且不会被混合。此标记在 Qt 5.6 中添加。

CreateTextureOptions 类型是QFlags<CreateTextureOption> 的类型定义。它存储 CreateTextureOption 值的 OR 组合。

enum QQuickWindow::RenderStage

常数说明
QQuickWindow::BeforeSynchronizingStage0同步前。
QQuickWindow::AfterSynchronizingStage1同步后
QQuickWindow::BeforeRenderingStage2渲染前
QQuickWindow::AfterRenderingStage3渲染后。
QQuickWindow::AfterSwapStage4帧交换后。
QQuickWindow::NoStage5尽快。此值在 Qt 5.6 中添加。

另请参阅 场景图和渲染

enum QQuickWindow::SceneGraphError

该枚举描述了sceneGraphError() 信号中的错误。

常量说明
QQuickWindow::ContextNotAvailable1图形上下文创建失败。这通常意味着没有找到合适的 OpenGL 实现,例如因为没有安装图形驱动程序,所以不支持 OpenGL 2。在使用 OpenGL ES 的移动和嵌入式板上,这种错误很可能表示窗口系统集成出现问题,也可能表示 Qt 配置不正确。

enum QQuickWindow::TextRenderType

该枚举描述了Qt Quick 中类文本元素的默认呈现类型(Text,TextInput 等)。

如果您希望文本在目标平台上看起来像本地文本,并且不需要文本转换等高级功能,请选择 NativeTextRendering。将此类功能与 NativeTextRendering 渲染类型结合使用,效果会很差,有时甚至会出现像素化。

QtTextRenderingCurveTextRendering 都是硬件加速技术。QtTextRendering 的速度更快,但内存消耗更大,在大尺寸时会出现渲染假象。如果QtTextRendering 不能提供良好的视觉效果,或优先考虑减少图形内存消耗,则应考虑将CurveTextRendering 作为替代选择。

常数说明
QQuickWindow::QtTextRendering0使用 Qt 自带的光栅化算法。
QQuickWindow::NativeTextRendering1对文本使用操作系统的本地光栅化器。
QQuickWindow::CurveTextRendering2使用直接在图形硬件上运行的曲线光栅器渲染文本。(在 Qt 6.7.0 中引入)。

属性文档

[read-only] activeFocusItem : QQuickItem* const

该属性保存当前处于活动焦点的项目,如果没有处于活动焦点的项目,则保存null

访问功能:

QQuickItem *activeFocusItem() const

Notifier 信号:

void activeFocusItemChanged()

另请参阅 QQuickItem::forceActiveFocus() 和 Qt Quick 中的键盘焦点

color : QColor

该属性用于保存每帧开始时用于清除颜色缓冲区的颜色。

默认情况下,清除颜色为白色。

访问功能

QColor color() const
void setColor(const QColor &color)

Notifier 信号:

void colorChanged(const QColor &)

另请参见 setDefaultAlphaBuffer().

[read-only] contentItem : QQuickItem* const

该属性用于保存场景的不可见根项目。

QQuickWindow 总是有一个不可见的根项目,其中包含所有内容。要在此窗口中添加项目,可将项目重定向至 contentItem 或场景中的现有项目。

访问功能:

QQuickItem *contentItem() const

transientParent : QWindow* const

该属性表示该窗口是暂存弹出窗口的窗口。

这将提示窗口管理器,此窗口是代表暂存父窗口的对话框或弹出窗口,暂存父窗口可以是任何类型的QWindow

根据窗口管理器的不同,为了使窗口在默认情况下居中于暂存父窗口,可能还需要将flags 属性设置为合适的Qt::WindowType (如Qt::Dialog )。

另请参阅 parent().

成员函数文档

[explicit] QQuickWindow::QQuickWindow(QQuickRenderControl *control)

构造一个用于显示 QML 场景的窗口,其渲染将由control 对象控制。更多信息请参阅QQuickRenderControl 文档。

[explicit] QQuickWindow::QQuickWindow(QWindow *parent = nullptr)

构建一个用于显示 QML 场景的窗口,其父窗口为parent

[override virtual noexcept] QQuickWindow::~QQuickWindow()

摧毁窗户

[override virtual] QAccessibleInterface *QQuickWindow::accessibleRoot() const

返回此窗口的辅助界面,如果无法创建此界面,则返回 0。

[signal] void QQuickWindow::afterAnimating()

在请求呈现线程执行场景图同步之前,GUI 线程会发出该信号。

与其他类似信号不同的是,这个信号是在 GUI 线程而非呈现线程上发出的。它可用于使外部动画系统与 QML 内容同步。同时,这也意味着该信号不适合触发图形操作。

[signal, since 6.0] void QQuickWindow::afterFrameEnd()

该信号在场景图提交帧后发出。该信号在所有其他相关信号(如afterRendering() )之后发出。它是场景图渲染线程渲染帧时发出的最后一个信号。

注意: frameSwapped() 不同,当Qt Quick 的输出通过QQuickRenderControl 重定向时,也会发出该信号。

警告: 此信号由场景图渲染线程发出。如果您的槽函数需要在继续执行之前完成,则必须确保连接是直接的(参见Qt::ConnectionType )。

此函数在 Qt 6.0 中引入。

另请参阅 beforeFrameBegin() 和rendererInterface()。

[signal] void QQuickWindow::afterRenderPassRecording()

该信号在场景图记录完主渲染通道的命令后发出,但该通道尚未在命令缓冲区中最终完成。

该信号比afterRendering() 更早发出,它不仅能保证帧,还能保证场景图主渲染通道的记录仍处于活动状态。这样就可以插入命令,而无需生成整个单独的渲染传递(通常会清除所附图像)。本机图形对象可通过QSGRendererInterface 查询。

注意: 资源更新(上传、复制)通常无法在渲染过程中进行。因此,更复杂的用户渲染需要同时连接beforeRendering() 和此信号。

警告: 此信号由场景图渲染线程发出。如果您的槽函数需要在继续执行之前完成,则必须确保连接是直接的(请参阅Qt::ConnectionType )。

另请参阅 rendererInterface() 和Scene Graph - RHI Under QML

[signal] 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 QMLScene Graph - OpenGL Under QMLScene Graph - Metal Under QMLScene Graph - Vulkan Under QMLScene 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() 和Scene Graph - RHI Under QML

[signal] void QQuickWindow::beforeRendering()

该信号在帧的准备工作完成后发出,这意味着在录制模式下有一个命令缓冲区(如适用)。如果需要,连接到此信号的槽函数可以像之前的命令一样,通过QSGRendererInterface 查询本地资源。但请注意,此时主渲染通道的录制尚未开始,因此无法在该通道中添加命令。开始一个渲染过程意味着清空颜色、深度和模板缓冲区,因此仅连接该信号无法实现底层类型的渲染。相反,应连接到beforeRenderPassRecording() 。不过,如果需要记录复制类型的命令,连接到此信号仍然很重要,因为这些命令无法在渲染过程中排队。

警告 此信号由场景图渲染线程发出。如果您的槽函数需要在继续执行之前完成,则必须确保连接是直接的(请参阅Qt::ConnectionType )。

注意: 使用 OpenGL 时,请注意设置 OpenGL 3.x 或 4.x 特定状态,并在从连接槽返回时将这些状态启用或设置为非默认值,这可能会干扰场景图的渲染。当信号发出时,场景图用于渲染的QOpenGLContext 将被绑定。

另请参阅 rendererInterface()、Scene Graph - RHI Under QMLScene Graph - OpenGL Under QMLScene Graph - Metal Under QMLScene Graph - Vulkan Under QMLScene Graph - Direct3D 11 Under QML

[signal] 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() 函数的替代功能。

QSGRenderNoderender() 实现中无需调用该函数和endExternalCommands(),因为场景图会为呈现节点隐式执行必要的步骤。

本地图形对象(如图形设备、命令缓冲区或编码器)可通过QSGRendererInterface::getResource() 访问。

警告 请注意,在 beginExternalCommands() -endExternalCommands() 之间,QSGRendererInterface::CommandListResource 可能会返回不同的对象。如果底层实现提供了专用的二级命令缓冲区,用于在渲染传递中记录外部图形命令,就会出现这种情况。因此,在调用此函数后,请始终查询 CommandListResource。不要尝试重复使用之前查询的对象。

注意: 当场景图使用 OpenGL 时,请注意上下文中的 OpenGL 状态可以有任意设置,而此函数不会将状态重置为默认值。

另请参阅 endExternalCommands() 和QQuickOpenGLUtils::resetOpenGLState() 。

[override virtual protected] void QQuickWindow::closeEvent(QCloseEvent *e)

重实现:QWindow::closeEvent(QCloseEvent *ev)。

QSGImageNode *QQuickWindow::createImageNode() const

创建一个简单的图像节点。当场景图未初始化时,返回值为空。

这是直接构建QSGSimpleTextureNode 的跨后台替代方法。

另请参阅 QSGImageNode

QSGNinePatchNode *QQuickWindow::createNinePatchNode() const

创建九个补丁节点。当场景图未初始化时,返回值为空。

QSGRectangleNode *QQuickWindow::createRectangleNode() const

创建一个简单的矩形节点。当场景图未初始化时,返回值为空。

这是跨后端直接构建QSGSimpleRectNode 的替代方法。

另请参阅 QSGRectangleNode

[since 6.7] QSGTextNode *QQuickWindow::createTextNode() const

创建文本节点。当场景图未初始化时,返回值为空。

此函数在 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 对该功能没有任何作用,因为默认情况下会使用 alpha 通道和混合。要选择退出,请设置TextureIsOpaque

当场景图使用 OpenGL 时,返回的纹理将使用GL_TEXTURE_2D 作为纹理目标,使用GL_RGBA 作为内部格式。使用其他图形 API 时,纹理格式通常是RGBA8 。请重新实现QSGTexture ,使用不同参数创建纹理。

警告: 如果场景图尚未初始化,此函数将返回 0。

警告:如果场景图尚未初始化,此函数将返回 0: 返回的纹理不是由场景图管理的内存,必须由调用者在渲染线程上明确删除。要做到这一点,可以通过QSGNode 析构函数删除纹理,或者在纹理已经与渲染线程亲和的情况下使用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 混合的成本。该标记与formatQRhiTexture 并无直接对应关系,也就是说,不设置该标记而使用诸如常用的QRhiTexture::RGBA8 等纹理格式是完全正常的。

贴图不受options 控制,因为texture 已经创建,并已将贴图的存在与否嵌入其中。

返回的QSGTexture 拥有QRhiTexture ,这意味着texture 将与返回的QSGTexture 一起销毁。

如果texture 拥有其底层本地图形资源(OpenGL 纹理对象、Vulkan 图像等),这取决于QRhiTexture 的创建方式(QRhiTexture::create() 或QRhiTexture::createFrom() ),本函数无法控制或更改。

注意: 只有当场景图已经初始化并使用默认的基于QRhi适配时,该函数才起作用。否则返回值为nullptr

注意: 此函数只能在场景图渲染线程上调用。

此函数在 Qt 6.6 中引入。

另请参阅 createTextureFromImage(),sceneGraphInitialized() 和QSGTexture

qreal QQuickWindow::effectiveDevicePixelRatio() const

返回此窗口的设备像素比例。

这与QWindow::devicePixelRatio() 不同,它支持通过QQuickRenderControlQQuickRenderTarget 重定向呈现。在使用QQuickRenderControl 时,QQuickWindow 通常未完全创建,这意味着它从未显示,窗口系统中也未创建底层本地窗口。因此,查询设备像素比等属性无法得到正确的结果。该函数同时考虑了QQuickRenderControl::renderWindowFor() 和QQuickRenderTarget::devicePixelRatio() 两种情况。如果没有重定向,结果与QWindow::devicePixelRatio() 相同。

另请参见 QQuickRenderControl,QQuickRenderTarget,setRenderTarget() 和QWindow::devicePixelRatio()。

void QQuickWindow::endExternalCommands()

在将原始图形(OpenGL、Vulkan、Metal 等)命令与场景图渲染混合时,有必要在将命令记录到场景图用于渲染其主渲染传递的命令缓冲区后调用此函数。这样做是为了避免掐断状态。

在实践中,该函数通常从连接到beforeRenderPassRecording() 或afterRenderPassRecording() 信号的槽中调用。

在向应用程序自己的命令缓冲区(如由应用程序创建和管理的 VkCommandBuffer 或 MTLCommandBuffer + MTLRenderCommandEncoder,而不是从场景图中获取)记录命令时,无需调用该函数。对于没有暴露本地命令缓冲区概念的图形 API(OpenGL、Direct 3D 11),beginExternalCommands() 和 endExternalCommands() 一起提供了 Qt XML 5 resetOpenGLState() 函数的替代功能。

QSGRenderNoderender() 实现中无需调用该函数和beginExternalCommands(),因为场景图会为呈现节点隐式执行必要的步骤。

另请参阅 beginExternalCommands() 和QQuickOpenGLUtils::resetOpenGLState()。

[override virtual protected] bool QQuickWindow::event(QEvent *event)

重实现:QWindow::event(QEvent *ev)。

[override virtual protected] void QQuickWindow::exposeEvent(QExposeEvent *)

重实现:QWindow::exposeEvent(QExposeEvent *ev)。

[override virtual protected] void QQuickWindow::focusInEvent(QFocusEvent *ev)

重实现:QWindow::focusInEvent(QFocusEvent *ev)。

[override virtual protected] void QQuickWindow::focusOutEvent(QFocusEvent *ev)

重实现:QWindow::focusOutEvent(QFocusEvent *ev)。

[signal] void QQuickWindow::frameSwapped()

该信号在帧排队等待呈现时发出。启用垂直同步后,在连续动画场景中,每个 vsync 间隔最多发出一次信号。

该信号将由场景图渲染线程发出。

QImage QQuickWindow::grabWindow()

抓取窗口内容并以图像形式返回。

可以在窗口不可见时调用 grabWindow() 函数。这要求窗口是created ,大小有效,且同一进程中没有其他QQuickWindow 实例正在渲染。

注意: 当该窗口与QQuickRenderControl 结合使用时,除非使用software 后端,否则该函数的结果将是空图像。这是因为当使用QQuickRenderControlsetRenderTarget() 将输出重定向到应用程序管理的图形资源(如纹理)时,应用程序更适合管理和执行最终的回读操作,因为它一开始就完全控制了资源。

警告: 调用此函数将导致性能问题。

警告:调用此函数将导致性能问题: 此函数只能在图形用户界面线程中调用。

[static, since 6.0] QSGRendererInterface::GraphicsApi QQuickWindow::graphicsApi()

返回场景图初始化时使用的图形 API。

查询场景图使用的 API 的标准方法是在场景图初始化后使用QSGRendererInterface::graphicsApi() ,例如在sceneGraphInitialized() 信号发出时或发出后。在这种情况下,我们会得到真实的结果,因为我们知道所有内容都是使用该图形 API 正确初始化的。

这并不总是很方便。如果应用程序需要设置外部框架,或者需要以依赖于场景图内置 API 选择逻辑的方式使用setGraphicsDevice() ,那么将这些操作推迟到QQuickWindow 可见或QQuickRenderControl::initialize() 被调用之后进行并不总是可行的。

因此,我们提供了这个静态函数作为setGraphicsApi() 的对应函数:它可以在任何时候调用,其结果反映了场景图在调用时初始化后会选择的 API。

注意: 此静态函数只能在主(图形用户界面)线程上调用。要在渲染时查询 API,请使用QSGRendererInterface ,因为该对象存在于渲染线程中。

注: 此函数不考虑场景图后端。

此函数在 Qt 6.0 中引入。

另请参阅 setGraphicsApi().

[since 6.0] QQuickGraphicsConfiguration QQuickWindow::graphicsConfiguration() const

返回传给setGraphicsConfiguration() 的QQuickGraphicsConfiguration ,否则返回默认构造的 。

此函数在 Qt 6.0 中引入。

另请参阅 setGraphicsConfiguration()。

[since 6.0] QQuickGraphicsDevice QQuickWindow::graphicsDevice() const

返回传给setGraphicsDevice() 的QQuickGraphicsDevice ,否则返回默认构造的 。

此函数在 Qt 6.0 中引入。

另请参阅 setGraphicsDevice()。

const QQuickWindow::GraphicsStateInfo &QQuickWindow::graphicsStateInfo()

返回对GraphicsStateInfo 结构的引用,该结构描述了 RHI 的一些内部状态,尤其是后端(如 Vulkan 或 Metal 集成)的双倍或三倍缓冲状态。当底层图形应用程序接口是 Vulkan 或 Metal,而外部渲染代码希望对其自身经常变化的资源(如统一缓冲区)执行双重或三重缓冲,以避免停滞流水线时,这一点就很重要。

[static] bool QQuickWindow::hasDefaultAlphaBuffer()

返回是否在新创建的窗口上使用 alpha 透明度。

另请参阅 setDefaultAlphaBuffer()。

[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。

[override virtual protected] void QQuickWindow::keyPressEvent(QKeyEvent *e)

重实现:QWindow::keyPressEvent(QKeyEvent *ev)。

[override virtual protected] void QQuickWindow::keyReleaseEvent(QKeyEvent *e)

重实现:QWindow::keyReleaseEvent(QKeyEvent *ev)。

[override virtual protected] void QQuickWindow::mouseDoubleClickEvent(QMouseEvent *event)

重实现:QWindow::mouseDoubleClickEvent(QMouseEvent *ev)。

[override virtual protected] void QQuickWindow::mouseMoveEvent(QMouseEvent *event)

重实现:QWindow::mouseMoveEvent(QMouseEvent *ev)。

[override virtual protected] void QQuickWindow::mousePressEvent(QMouseEvent *event)

重实现:QWindow::mousePressEvent(QMouseEvent *ev)。

[override virtual protected] void QQuickWindow::mouseReleaseEvent(QMouseEvent *event)

重实现:QWindow::mouseReleaseEvent(QMouseEvent *ev)。

[slot] void QQuickWindow::releaseResources()

此函数尝试释放 QML 场景当前持有的冗余资源。

调用此函数会要求场景图释放缓存的图形资源,如图形管道对象、着色器程序或图像数据。

此外,根据所使用的渲染循环,该函数还可能释放场景图和所有与窗口相关的渲染资源。如果出现这种情况,将发出sceneGraphInvalidated() 信号,允许用户清理自己的图形资源。如果在应用程序中处理清理工作不可行,可以使用setPersistentGraphics() 和setPersistentSceneGraph() 函数来防止这种情况发生,但代价是增加内存使用量。

注意: 缓存图形资源(如图形管道或着色器程序)的释放与持久性提示无关。无论持久性图形和场景图提示的值如何,都会释放这些图形资源。

注意: 此函数与QQuickItem::releaseResources() 虚拟函数无关。

另请参见 sceneGraphInvalidated()、setPersistentGraphics() 和setPersistentSceneGraph()。

[since 6.0] QQuickRenderTarget QQuickWindow::renderTarget() const

返回传给setRenderTarget() 的QQuickRenderTarget ,否则返回默认构造的 。

此函数在 Qt 6.0 中引入。

另请参阅 setRenderTarget()。

QSGRendererInterface *QQuickWindow::rendererInterface() const

返回当前的呈现器界面。该值始终有效,不会为空。

注意: 该函数可在构建QQuickWindow 后的任何时间调用,即使isSceneGraphInitialized() 仍然为假。不过,有些呈现器接口函数,尤其是QSGRendererInterface::getResource() 在场景图启动并运行之前是不起作用的。另一方面,后端查询,如QSGRendererInterface::graphicsApi() 或QSGRendererInterface::shaderType() 将始终有效。

注意: 返回指针的所有权归 Qt 所有。返回的实例可能在不同的QQuickWindow 实例之间共享,也可能不共享,这取决于所使用的场景图后端。因此,应用程序应为每个QQuickWindow 查询接口对象,而不是重复使用已查询过的指针。

另请参阅 QSGRenderNodeQSGRendererInterface

[override virtual protected] void QQuickWindow::resizeEvent(QResizeEvent *ev)

重实现:QWindow::resizeEvent(QResizeEvent *ev)。

[since 6.6] QRhi *QQuickWindow::rhi() const

返回该窗口用于渲染的QRhi 对象。

仅在窗口使用 Qt 3D API 和着色语言抽象时可用,这意味着在使用software 适配时,结果始终为空。

只有在初始化渲染后,即发出sceneGraphInitialized() 信号时,结果才有效。在此之前,返回值为空。对于常规的屏幕QQuickWindow 场景图,初始化通常发生在本机窗口第一次暴露(显示)时。使用QQuickRenderControl 时,初始化在显式initialize() 调用中完成。

实际上,该函数是通过QSGRendererInterface 查询QRhi 的快捷方式。

该函数在 Qt 6.6 中引入。

[signal] 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)

当场景图初始化过程中出现error 时,将发出该信号。

如果应用程序希望以自定义方式处理图形上下文创建失败等错误,则应连接到此信号。如果没有槽连接到该信号,行为将有所不同:Quick 将打印message 或显示消息框,并终止应用程序。

该信号将从图形用户界面线程中发出。

[signal] void QQuickWindow::sceneGraphInitialized()

该信号在场景图初始化时发出。

该信号将由场景图渲染线程发出。

[signal] void QQuickWindow::sceneGraphInvalidated()

该信号在场景图失效时发出。

该信号意味着所使用的图形渲染上下文已失效,应释放与该上下文绑定的所有用户资源。

在使用 OpenGL 渲染时,调用此函数时将绑定该窗口的QOpenGLContext 。唯一的例外是原生 OpenGL 已在 Qt 控制之外被销毁,例如通过 EGL_CONTEXT_LOST。

该信号将从场景图渲染线程发出。

void QQuickWindow::scheduleRenderJob(QRunnable *job, QQuickWindow::RenderStage stage)

调度job 在该窗口的渲染达到给定的stage 时运行。

这与QQuickWindow 中的 "一次性 "任务信号类似,非常方便。

该窗口拥有job 的所有权,并将在任务完成后将其删除。

如果渲染在job 有机会运行之前关闭,则会运行该任务,然后作为场景图清理的一部分将其删除。如果在QQuickWindow 销毁之前从未显示窗口,也没有进行渲染,那么所有待处理的作业都将被销毁,而不会调用其 run() 方法。

如果渲染在不同的线程上进行,那么作业将在渲染线程上进行。

如果stageNoStagejob 将在渲染线程不忙着渲染帧时尽早运行。如果在发布或处理作业时,窗口未暴露且不可呈现,则作业会被删除,而不会执行 run() 方法。如果使用的是非线程渲染器,作业的 run() 方法将同步执行。使用 OpenGL 渲染时,在执行任何作业(包括NoStage 作业)之前,OpenGL 上下文会更改为渲染器的上下文。

注意: 此函数不会触发渲染;在其他地方触发渲染之前,以NoStage 以外的任何其他阶段为目标的作业都将被存储运行。要强制作业提前运行,请调用QQuickWindow::update() ;

另请参阅 beforeRendering()、afterRendering()、beforeSynchronizing()、afterSynchronizing()、frameSwapped() 和sceneGraphInvalidated()。

[static] void QQuickWindow::setDefaultAlphaBuffer(bool useAlpha)

useAlpha 指定是否在新创建的窗口中使用 alpha 透明度。

在任何希望创建半透明窗口的应用程序中,有必要在创建第一个QQuickWindow 之前将其设置为 true。默认值为 false。

另请参阅 hasDefaultAlphaBuffer()。

[static, since 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,但必须在所有现有的QQuickRenderControlQQuickWindow 实例都已销毁时才能更改。

要查询场景图在渲染时使用的图形 API,请在场景图has initialized 之后调用QSGRendererInterface::graphicsApi() ,这通常发生在窗口首次可见或调用QQuickRenderControl::initialize() 时。

要切换回默认行为(即场景图根据平台和其他条件选择图形 API),请将api 设置为QSGRendererInterface::Unknown

此函数在 Qt 6.0 中引入。

另请参阅 graphicsApi()。

[since 6.0] void QQuickWindow::setGraphicsConfiguration(const QQuickGraphicsConfiguration &config)

设置此窗口的图形配置。config 包含场景图在初始化底层图形设备和上下文时可能会考虑到的各种设置。

在集成依赖于某些扩展的本地图形渲染代码时,此类附加配置(例如指定 Vulkan 应启用哪些设备扩展)变得非常重要。与 OpenXR 等外部 3D 或 VR 引擎集成时也是如此。

注: 通过setGraphicsDevice() 采用现有图形设备时,配置将被忽略,因为场景图无法控制这些对象的实际构建。

QQuickGraphicsConfiguration 实例是隐式共享的、可复制的,并可按值传递。

警告: QQuickWindow 上设置QQuickGraphicsConfiguration 必须尽早进行,即在首次初始化该窗口的场景图之前。对于屏幕窗口,这意味着必须在调用QQuickWindowQQuickView 上的show() 之前完成调用。对于QQuickRenderControl ,必须在调用initialize() 之前完成配置。

该函数在 Qt 6.0 中引入。

另请参阅 graphicsConfiguration()。

[since 6.0] void QQuickWindow::setGraphicsDevice(const QQuickGraphicsDevice &device)

设置此窗口的图形设备对象。场景图将使用device 指定的现有设备、物理设备和其他对象,而不是创建新对象。

该函数通常与QQuickRenderControlsetRenderTarget() 结合使用,以便将Qt Quick 渲染重定向到纹理中。

默认构建的QQuickGraphicsDevice 不会以任何方式改变默认行为。一旦传入通过QQuickGraphicsDevice 工厂函数(如QQuickGraphicsDevice::fromDeviceObjects() )之一创建的device ,且场景图使用了匹配的图形 API(以 fromDeviceObjects() 为例,即 Vulkan),场景图将使用QQuickGraphicsDevice 封装的现有设备对象(如VkPhysicalDeviceVkDevice 以及 Vulkan 的图形队列族索引)。这样就可以使用相同的设备,从而在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);
...

使用该函数的关键是确保外部渲染引擎和场景图渲染器都能看到并使用资源或资源句柄(如上例中的texture )。这就要求使用相同的图形设备(或 OpenGL、OpenGL 上下文)。

QQuickGraphicsDevice 实例是隐式共享的、可复制的,并且可以通过值传递。它们并不拥有相关的本地对象(如示例中的 ID3D11Device)。

注: 使用QQuickRenderControl 并不总是意味着必须调用该函数。当不需要采用现有设备或上下文时,不应调用此函数,然后场景图将正常初始化其自身的设备和上下文,就像使用屏幕上的QQuickWindow 一样。

此函数在 Qt 6.0 中引入。

另请参阅 graphicsDevice(),QQuickRenderControl,setRenderTarget() 和setGraphicsApi() 。

void QQuickWindow::setPersistentGraphics(bool persistent)

设置图形资源(图形设备或上下文、交换链、缓冲区、纹理)是否应被保留,并且在最后一个窗口被删除之前不能被释放,默认值为persistent

当调用releaseResources() 或窗口被隐藏(更具体地说,不可渲染)时,某些渲染循环可能会释放所有图形资源,而不仅仅是缓存的图形资源。这可以暂时释放内存,但也意味着当窗口需要再次渲染时,渲染引擎将不得不重新初始化全部资源,代价可能会很高。

注: 窗口何时不可呈现的规则取决于平台和窗口管理器。

注: 删除最后一个QQuickWindow 时,将释放所有图形资源,与此设置无关。

注: 这只是一个提示,并不保证会被考虑在内。

注意: 此提示不适用于缓存资源,因为缓存资源的删除和稍后重新创建成本相对较低。因此,无论该提示的值如何,调用releaseResources() 通常都会释放这些资源。

另请参阅 isPersistentGraphics()、setPersistentSceneGraph()、sceneGraphInitialized()、sceneGraphInvalidated() 和releaseResources()。

void QQuickWindow::setPersistentSceneGraph(bool persistent)

设置场景图节点和资源是否persistent 。持久意味着节点和资源不能被释放。默认值为true

调用releaseResources() 时,当窗口被隐藏(更确切地说,不可渲染)时,某些渲染循环可能会释放场景图节点和相关图形资源。这将暂时释放内存,但也意味着下次窗口渲染时必须重建场景图。

注: 窗口何时不可渲染的规则取决于平台和窗口管理器。

注: 删除最后一个QQuickWindow 时,场景图节点和资源始终会被释放,与此设置无关。

注: 这只是一个提示,并不保证会被考虑在内。

另请参阅 isPersistentSceneGraph(),setPersistentGraphics(),sceneGraphInvalidated(),sceneGraphInitialized() 和releaseResources().

[since 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 中引用的本地对象对场景图渲染器也有效。例如,对于 Vulkan、Metal 和 Direct3D,这意味着纹理或图像是在场景图内部使用的同一图形设备上创建的。因此,当涉及在现有设备或上下文中创建的纹理对象时,该函数通常与setGraphicsDevice() 结合使用。

注: 对于相关的图形 API,应用程序必须注意场景图执行的图像布局转换。例如,通过调用此函数将 VkImage 与场景图关联后,其布局将在渲染帧时过渡到VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL

警告: 此函数只能在进行渲染的线程中调用。

此函数在 Qt 6.0 中引入。

另请参阅 renderTarget(),QQuickRenderControl,setGraphicsDevice() 和setGraphicsApi() 。

[static] void QQuickWindow::setSceneGraphBackend(const QString &backend)

请求Qt Quick 场景图backend 。后端可以是内置的,也可以以动态加载插件的形式安装。

这是一个重载函数。

注意: 必须在构建应用程序中的第一个QQuickWindow 之前调用该函数。之后不能更改。

有关后端列表的更多信息,请参阅在应用程序中切换适配。如果backend 无效或发生错误,请求将被忽略。

注意: 调用此函数等同于设置QT_QUICK_BACKENDQMLSCENE_DEVICE 环境变量。不过,在产生其他进程的应用程序中使用此 API 更为安全,因为无需担心环境继承问题。

另请参阅 sceneGraphBackend()。

[static] void QQuickWindow::setTextRenderType(QQuickWindow::TextRenderType renderType)

Qt Quick 中文本类元素的默认呈现类型设置为renderType

注意: 设置呈现类型只会影响之后创建的元素;现有元素的呈现类型不会被修改。

另请参阅 textRenderType() 。

[override virtual protected] void QQuickWindow::showEvent(QShowEvent *)

重实现:QWindow::showEvent(QShowEvent *ev)。

[since 6.6] QRhiSwapChain *QQuickWindow::swapChain() const

返回此窗口使用的QRhiSwapChain (如果有)。

注意: 只有由标准渲染循环(如basicthreaded )支持的屏幕窗口才会有交换链。否则返回值为空。例如,当窗口与QQuickRenderControl 一起使用时,结果始终为空。

此函数在 Qt 6.6 中引入。

[override virtual protected] void QQuickWindow::tabletEvent(QTabletEvent *event)

重实现:QWindow::tabletEvent(QTabletEvent *ev)。

[static] QQuickWindow::TextRenderType QQuickWindow::textRenderType()

返回Qt Quick 中类文本元素的呈现类型。默认为QQuickWindow::QtTextRendering

另请参阅 setTextRenderType() 。

[slot] void QQuickWindow::update()

安排窗口渲染另一帧。

调用 QQuickWindow::update() 与QQuickItem::update() 的不同之处在于,无论底层场景图是否发生变化,它都会触发重绘。

[override virtual protected] void QQuickWindow::wheelEvent(QWheelEvent *event)

重实现:QWindow::wheelEvent(QWheelEvent *ev)。

© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.