QQuickWidget Class
QQuickWidget 类提供了一个用于显示Qt Quick 用户界面的控件。更多内容...
| 头文件: | #include <qquickwidget.h> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS QuickWidgets) target_link_libraries(mytarget PRIVATE Qt6::QuickWidgets) |
| qmake: | QT += quickwidgets |
| 继承自: | QWidget |
公共类型
| enum | ResizeMode { SizeViewToRootObject, SizeRootObjectToView } |
| enum | Status { Null, Ready, Loading, Error } |
属性
- resizeMode : ResizeMode
- source : QUrl
- status : Status
公共函数
| QQuickWidget(QWidget *parent = nullptr) | |
| QQuickWidget(QQmlEngine *engine, QWidget *parent) | |
| QQuickWidget(const QUrl &source, QWidget *parent = nullptr) | |
(since 6.9) | QQuickWidget(QAnyStringView uri, QAnyStringView typeName, QWidget *parent = nullptr) |
| virtual | ~QQuickWidget() override |
| QQmlEngine * | engine() const |
| QList<QQmlError> | errors() const |
| QSurfaceFormat | format() const |
| QImage | grabFramebuffer() const |
| QSize | initialSize() const |
| QQuickWindow * | quickWindow() const |
| QQuickWidget::ResizeMode | resizeMode() const |
| QQmlContext * | rootContext() const |
| QQuickItem * | rootObject() const |
| void | setClearColor(const QColor &color) |
| void | setFormat(const QSurfaceFormat &format) |
| void | setResizeMode(QQuickWidget::ResizeMode) |
| QUrl | source() const |
| QQuickWidget::Status | status() const |
公共槽位
(since 6.9) void | loadFromModule(QAnyStringView uri, QAnyStringView typeName) |
(since 6.9) void | setInitialProperties(const QVariantMap &initialProperties) |
| void | setSource(const QUrl &url) |
信号
| void | sceneGraphError(QQuickWindow::SceneGraphError error, const QString &message) |
| void | statusChanged(QQuickWidget::Status status) |
重新实现的受保护函数
| virtual void | dragEnterEvent(QDragEnterEvent *e) override |
| virtual void | dragLeaveEvent(QDragLeaveEvent *e) override |
| virtual void | dragMoveEvent(QDragMoveEvent *e) override |
| virtual void | dropEvent(QDropEvent *e) override |
| virtual bool | event(QEvent *e) override |
| virtual void | focusInEvent(QFocusEvent *event) override |
| virtual bool | focusNextPrevChild(bool next) override |
| virtual void | focusOutEvent(QFocusEvent *event) override |
| virtual void | hideEvent(QHideEvent *) override |
| virtual void | keyPressEvent(QKeyEvent *e) override |
| virtual void | keyReleaseEvent(QKeyEvent *e) override |
| virtual void | mouseDoubleClickEvent(QMouseEvent *e) override |
| virtual void | mouseMoveEvent(QMouseEvent *e) override |
| virtual void | mousePressEvent(QMouseEvent *e) override |
| virtual void | mouseReleaseEvent(QMouseEvent *e) override |
| virtual void | paintEvent(QPaintEvent *event) override |
| virtual void | showEvent(QShowEvent *) override |
| virtual void | wheelEvent(QWheelEvent *e) override |
详细说明
这是一个用于QQuickWindow 的便捷封装类,当提供主源文件的URL时,它会自动加载并显示一个QML场景。此外,您还可以使用QQmlComponent 实例化自己的对象,并将它们放置在手动设置的QQuickWidget中。
典型用法:
QQuickWidget *view = new QQuickWidget;
view->setSource(QUrl::fromLocalFile("myqmlfile.qml"));
view->show();若要接收与通过 QQuickWidget 加载和执行 QML 相关的错误,可连接到statusChanged() 信号并监听QQuickWidget::Error 。可通过QQuickWidget::errors() 获取这些错误。
QQuickWidget 还负责管理视图和根对象的尺寸调整。默认情况下,resizeMode 设置为SizeViewToRootObject ,这将加载组件并将其调整为视图的大小。或者,可以将resizeMode 设置为SizeRootObjectToView ,这将把视图调整为根对象的大小。
性能注意事项
QQuickWidget 是使用QQuickView 和QWidget::createWindowContainer() 的替代方案。它不受堆叠顺序的限制,因此 QQuickWidget 是一种更灵活的替代方案,其行为更接近于普通小部件。
然而,上述优势是以性能为代价的:
- 与QQuickWindow 和QQuickView 不同,QQuickWidget 至少涉及一次额外的渲染过程,该过程针对的是离屏颜色缓冲区(通常为 2D 纹理),随后才会绘制纹理四边形。这意味着负载会增加,特别是对 GPU 的片元处理而言。
- 在所有平台上,使用 QQuickWidget 都会禁用多线程渲染循环。这意味着多线程渲染的一些优势(例如Animator 类和由垂直同步驱动的动画)将无法使用。
注意:请避免 在 QQuickWidget 上调用winId()。该函数会触发原生窗口的创建,从而导致性能下降,并可能引发渲染故障。QQuickWidget 的全部目的在于无需单独的原生窗口即可渲染 Quick 场景,因此应始终避免将其转换为原生控件。
图形 API 支持
QQuickWidget 可与Qt Quick 支持的所有 3D 图形 API 以及software 后端配合使用。但其他后端(例如 OpenVG)则不兼容,尝试构建 QQuickWidget 将会导致问题。
覆盖平台的默认图形 API 的方式与QQuickWindow 和QQuickView 相同:要么在构建第一个 QQuickWidget 之前尽早调用QQuickWindow::setGraphicsApi(),要么设置QSG_RHI_BACKEND 环境变量。
注意:一个 顶级窗口在渲染时只能使用一种图形 API。例如,如果尝试在同一个顶级窗口的小部件层次结构中,同时使用 Vulkan 和QOpenGLWidget 放置 QQuickWidget,将会出现问题,其中一个小部件将无法按预期渲染。
场景图与上下文持久性
QQuickWidget 支持 `QQuickWindow::isPersistentSceneGraph()` 功能,这意味着应用程序可以通过对 `quickWindow()` 函数返回的窗口调用 `QQuickWindow::setPersistentSceneGraph()`,来决定在小部件被隐藏时释放场景图节点及其他与Qt Quick 场景相关的资源。默认情况下,持久性功能处于启用状态,这与 `QQuickWindow` 的行为一致。
在使用 OpenGL 运行时,QQuickWindow 还提供了禁用持久化 OpenGL 上下文的选项。目前 QQuickWidget 会忽略此设置,因此上下文始终保持持久化状态。 因此,隐藏小部件时不会销毁 OpenGL 上下文。只有在小部件被销毁,或者小部件被重新添加到另一个顶级小部件的子节点层次结构中时,上下文才会被销毁。 然而,某些应用程序(特别是那些因在Qt Quick 场景中执行自定义 OpenGL 渲染而拥有自己图形资源的应用程序)可能希望禁用后者,因为它们可能无法处理将 QQuickWidget 移动到另一个窗口时上下文丢失的情况。此类应用程序可以设置 QCoreApplication::AA_ShareOpenGLContexts 属性。 有关资源初始化和清理的详细讨论,请参阅QOpenGLWidget 文档。
注意: 与QOpenGLWidget 相比,QQuickWidget 对其内部OpenGL上下文的控制粒度较低,且存在细微差异,最显著的一点是:禁用持久场景图将导致在窗口切换时销毁上下文,无论是否设置了QCoreApplication::AA_ShareOpenGLContexts。
限制
将其他小部件放置在下方并使 QQuickWidget 透明不会产生预期的结果:下方的 widget 将不可见。这是因为实际上 QQuickWidget 会在所有其他常规的非 OpenGL 小部件之前被绘制,因此透视类型的解决方案并不可行。 其他类型的布局(例如将小部件放置在 QQuickWidget 之上)将按预期工作。
在绝对必要的情况下,可以通过在 QQuickWidget 上设置Qt::WA_AlwaysStackOnTop 属性来克服这一限制。但请注意,这会破坏堆叠顺序。 例如,将无法在 QQuickWidget 上方放置其他小部件,因此该属性仅应在需要半透明的 QQuickWidget 且其下方其他小部件可见的情况下使用。
此限制仅在同一窗口内 QQuickWidget 下方存在其他控件时才适用。若要使窗口呈半透明状态(以便在背景中显示其他应用程序和桌面),请采用传统方法:在顶级窗口上设置 `Qt::WA_TranslucentBackground `,请求一个 alpha 通道,并通过 `setClearColor()` 将Qt Quick 场景图的清除颜色更改为 `Qt::transparent `。
另请参阅 《将 C++ 类型的属性暴露给 QML》、《Qt Quick 控件示例》以及《QQuickView 》。
成员类型文档
enum QQuickWidget::ResizeMode
此枚举指定了如何调整视图的大小。
| 常量 | 值 | 描述 |
|---|---|---|
QQuickWidget::SizeViewToRootObject | 0 | 视图将随 QML 中的根项一起调整大小。 |
QQuickWidget::SizeRootObjectToView | 1 | 视图将自动将根项调整为与视图大小一致。 |
enum QQuickWidget::Status
指定QQuickWidget 的加载状态。
| 常量 | 值 | 描述 |
|---|---|---|
QQuickWidget::Null | 0 | 此QQuickWidget 未设置源。 |
QQuickWidget::Ready | 1 | 该QQuickWidget 已加载并创建了QML组件。 |
QQuickWidget::Loading | 2 | 此QQuickWidget 正在加载网络数据。 |
QQuickWidget::Error | 3 | 发生了一个或多个错误。调用errors()可获取错误列表。 |
属性文档
resizeMode : ResizeMode
确定视图是否应调整窗口内容的大小。
如果此属性设置为SizeViewToRootObject (默认值),则视图将调整大小以适应 QML 中根项的大小。
如果将此属性设置为SizeRootObjectToView ,视图将自动将根项调整为与视图大小一致。
无论此属性设置如何,视图的 sizeHint 都是根项的初始大小。但请注意,由于 QML 可能会动态加载,该大小可能会发生变化。
访问函数:
| QQuickWidget::ResizeMode | resizeMode() const |
| void | setResizeMode(QQuickWidget::ResizeMode) |
另请参阅 ` initialSize()`。
source : QUrl
该属性存储了 QML 组件源文件的 URL。
请确保提供的 URL 完整且正确,特别是从本地文件系统加载文件时,请使用QUrl::fromLocalFile()。
注意:设置 源 URL 会导致 QML 组件被实例化,即使该 URL 与当前值相同也是如此。
访问函数:
[read-only] status : Status
该组件的当前status 。
访问函数:
| QQuickWidget::Status | status() const |
通知器信号:
| void | statusChanged(QQuickWidget::Status status) |
成员函数文档
[explicit] QQuickWidget::QQuickWidget(QWidget *parent = nullptr)
创建一个使用默认 QML 引擎的 QQuickWidget,并将其作为parent 的子控件。
parent 的默认值为nullptr 。
QQuickWidget::QQuickWidget(QQmlEngine *engine, QWidget *parent)
根据给定的 QMLengine 创建一个 QQuickWidget,将其作为parent 的子控件。
注意:该 QQuickWidget 不会接管所给engine 对象的所有权;销毁引擎是调用方的责任。如果engine 在视图之前被删除,status() 将返回QQuickWidget::Error 。
[explicit] QQuickWidget::QQuickWidget(const QUrl &source, QWidget *parent = nullptr)
创建一个 QQuickWidget,使用默认的 QML 引擎,并将给定的 QMLsource 作为parent 的子控件。
parent 的默认值为nullptr 。
[explicit, since 6.9] QQuickWidget::QQuickWidget(QAnyStringView uri, QAnyStringView typeName, QWidget *parent = nullptr)
创建一个 QQuickWidget,其元素由 `uri ` 和 `typeName ` 指定,父对象为 `parent`。`parent ` 的默认值为 `nullptr`。
该函数在 Qt 6.9 中引入。
另请参阅 loadFromModule 。
[override virtual noexcept] QQuickWidget::~QQuickWidget()
销毁QQuickWidget 。
[override virtual protected] void QQuickWidget::dragEnterEvent(QDragEnterEvent *e)
重写:QWidget::dragEnterEvent(QDragEnterEvent *event)。
[override virtual protected] void QQuickWidget::dragLeaveEvent(QDragLeaveEvent *e)
重写了:QWidget::dragLeaveEvent(QDragLeaveEvent *event)。
[override virtual protected] void QQuickWidget::dragMoveEvent(QDragMoveEvent *e)
重写了:QWidget::dragMoveEvent(QDragMoveEvent *event)。
[override virtual protected] void QQuickWidget::dropEvent(QDropEvent *e)
重写了:QWidget::dropEvent(QDropEvent *event)。
QQmlEngine *QQuickWidget::engine() const
返回一个指向用于实例化 QML 组件的QQmlEngine 的指针。
QList<QQmlError> QQuickWidget::errors() const
返回上次编译或创建操作期间发生的错误列表。当状态不是Error 时,将返回一个空列表。
另请参阅 status 。
[override virtual protected] bool QQuickWidget::event(QEvent *e)
重写了:QWidget::event(QEvent *event)。
[override virtual protected] void QQuickWidget::focusInEvent(QFocusEvent *event)
重写了:QWidget::focusInEvent(QFocusEvent *event)。
[override virtual protected] bool QQuickWidget::focusNextPrevChild(bool next)
重新实现了:QWidget::focusNextPrevChild (bool next)。
[override virtual protected] void QQuickWidget::focusOutEvent(QFocusEvent *event)
重写了:QWidget::focusOutEvent(QFocusEvent *event)。
QSurfaceFormat QQuickWidget::format() const
返回实际的表面格式。
如果该控件尚未显示,则返回请求的格式。
另请参阅 setFormat()。
QImage QQuickWidget::grabFramebuffer() const
渲染一帧并将其读回图像中。
注意:这是一项 可能耗时较长的操作。
[override virtual protected] void QQuickWidget::hideEvent(QHideEvent *)
重写了:QWidget::hideEvent(QHideEvent *event)。
QSize QQuickWidget::initialSize() const
返回根对象的初始大小。
如果resizeMode 的值为SizeRootObjectToView ,则根对象将调整为视图的大小。该函数返回根对象在调整大小之前的大小。
[override virtual protected] void QQuickWidget::keyPressEvent(QKeyEvent *e)
重写了:QWidget::keyPressEvent(QKeyEvent *event)。
[override virtual protected] void QQuickWidget::keyReleaseEvent(QKeyEvent *e)
重写了:QWidget::keyReleaseEvent(QKeyEvent *event)。
[slot, since 6.9] void QQuickWidget::loadFromModule(QAnyStringView uri, QAnyStringView typeName)
加载由uri 和typeName 标识的 QML 组件。如果该组件由一个 QML 文件支持,则source 将相应地被设置。对于在C++ 中定义的类型,source 将为空。
如果在调用此方法之前已设置任何source ,则该值将被清空。
若使用相同的uri 和typeName 多次调用此方法,将导致 QML 组件被重新实例化。
此函数在 Qt 6.9 中引入。
另请参阅 setSource 、QQmlComponent::loadFromModule 和QQmlApplicationEngine::loadFromModule 。
[override virtual protected] void QQuickWidget::mouseDoubleClickEvent(QMouseEvent *e)
重写了:QWidget::mouseDoubleClickEvent(QMouseEvent *event)。
[override virtual protected] void QQuickWidget::mouseMoveEvent(QMouseEvent *e)
重写了:QWidget::mouseMoveEvent(QMouseEvent *event)。
[override virtual protected] void QQuickWidget::mousePressEvent(QMouseEvent *e)
重写了:QWidget::mousePressEvent(QMouseEvent *event)。
[override virtual protected] void QQuickWidget::mouseReleaseEvent(QMouseEvent *e)
重写了:QWidget::mouseReleaseEvent(QMouseEvent *event)。
[override virtual protected] void QQuickWidget::paintEvent(QPaintEvent *event)
重写了:QWidget::paintEvent(QPaintEvent *event)。
QQuickWindow *QQuickWidget::quickWindow() const
返回该控件用于驱动Qt Quick 渲染的离屏QQuickWindow 。如果您希望使用QQuickWidget 当前尚未公开的QQuickWindow API(例如,连接到QQuickWindow::beforeRendering() 信号,以便在Qt Quick 自身的渲染层下方绘制原生 OpenGL 内容),此功能将非常有用。
警告:请 谨慎使用 此函数的返回值。特别是,切勿尝试显示QQuickWindow ,并在使用其他仅限QWindow 的API时务必格外小心。
警告: 在QQuickWidget 的生命周期内,离屏窗口 可能会被删除(并重新创建),特别是在小部件被移动到另一个QQuickWindow 时。如果您需要知道窗口何时被替换,请连接到其destroyed()信号。
QQmlContext *QQuickWidget::rootContext() const
该函数返回上下文层次结构的根节点。每个 QML 组件都会在QQmlContext 中实例化。QQmlContext 对于将数据传递给 QML 组件至关重要。在 QML 中,上下文按层次结构排列,该层次结构由QQmlEngine 管理。
QQuickItem *QQuickWidget::rootObject() const
返回视图的根item 。当未调用setSource()时,或调用时QtQuick 代码存在错误,或者根项因其他原因未定义时,该值可能是nullptr 。
[signal] void QQuickWidget::sceneGraphError(QQuickWindow::SceneGraphError error, const QString &message)
当在场景图初始化过程中发生error 时,会发出此信号。
如果应用程序希望以自定义方式处理错误(例如 OpenGL 上下文创建失败),应连接此信号。若未将任何槽连接到该信号,则行为将有所不同:Quick 会打印message ,或显示一个消息框,并终止应用程序。
该信号将由GUI线程发出。
另请参阅 QQuickWindow::sceneGraphError()。
void QQuickWidget::setClearColor(const QColor &color)
设置透明的color 。默认情况下,该颜色是不透明的。
若要获得半透明的QQuickWidget ,请在调用此函数时将color 设置为Qt::transparent ,在顶级窗口上设置Qt::WA_TranslucentBackground 控件属性,并通过setFormat()请求Alpha通道。
另请参阅 QQuickWindow::setColor()。
void QQuickWidget::setFormat(const QSurfaceFormat &format)
为该控件所使用的上下文和离屏表面设置表面format 。
当需要为给定的 OpenGL 版本或配置文件请求上下文时,请调用此函数。深度、模板和透明度缓冲区的尺寸将自动处理,无需显式请求。
另请参阅 QWindow::setFormat()、QWindow::format() 和format()。
[slot, since 6.9] void QQuickWidget::setInitialProperties(const QVariantMap &initialProperties)
设置初始属性initialProperties ,QML组件在调用QQuickWidget::setSource()后将以此进行初始化。
注意:您 只能使用此函数来初始化顶级属性。
注意:此 函数应始终在调用 `setSource` 之前调用,因为一旦组件进入 `Ready` 状态,此函数将不再生效。
此函数在 Qt 6.9 中引入。
另请参阅 QQmlComponent::createWithInitialProperties()。
[slot] void QQuickWidget::setSource(const QUrl &url)
将源设置为url ,加载 QML 组件并实例化它。
请确保提供的 URL 完整且正确,特别是从本地文件系统加载文件时,请使用QUrl::fromLocalFile()。
使用相同的 URL 多次调用此方法将导致 QML 组件被重新实例化。
注意: 这是属性source 的设置器 函数。
另请参阅 source()。
[override virtual protected] void QQuickWidget::showEvent(QShowEvent *)
重写了:QWidget::showEvent(QShowEvent *event)。
QUrl QQuickWidget::source() const
返回源 URL(如果已设置)。
注意: 这是 source 属性的获取 函数。
另请参阅 setSource()。
[signal] void QQuickWidget::statusChanged(QQuickWidget::Status status)
当组件的当前status 发生变化时,会发出此信号。
注意: 这是属性status 的通知器 信号。
[override virtual protected] void QQuickWidget::wheelEvent(QWheelEvent *e)
重写了:QWidget::wheelEvent(QWheelEvent *event)。
© 2026 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.