QQuickWidget Class
QQuickWidget 类提供了一个用于显示Qt Quick 用户界面的 widget。更多
Header: | #include <QQuickWidget> |
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 : const 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 更为灵活,其行为更像普通的 widget。
不过,上述优点是以牺牲性能为代价的:
- 与QQuickWindow 和QQuickView 不同,QQuickWidget 在绘制纹理四边形后,至少还需要一次额外的渲染传递,目标是屏幕外的颜色缓冲区,通常是二维纹理。这意味着增加了负载,尤其是 GPU 的片段处理负载。
- 在所有平台上,使用 QQuickWidget 都会禁用线程渲染循环。这意味着线程渲染的某些优势将无法使用,例如Animator 类和 vsync 驱动的动画。
注意: 避免在 QQuickWidget 上调用winId() 函数。该函数会触发本地窗口的创建,从而降低性能,并可能导致渲染故障。QQuickWidget 的整个目的是在没有单独本地窗口的情况下渲染快速场景,因此应始终避免将其作为本地 widget。
图形应用程序接口支持
QQuickWidget 支持Qt Quick 以及software
后端所支持的所有 3D 图形 API。不过,其他后端(如OpenVG)并不兼容,因此尝试构建QQuickWidget会出现问题。
重写平台默认图形 API 的方法与QQuickWindow 和QQuickView 相同:在构建第一个 QQuickWidget 之前调用QQuickWindow::setGraphicsApi() 或设置QSG_RHI_BACKEND
环境变量。
注意: 一个顶级窗口只能使用一个图形 API 进行渲染。例如,如果尝试在同一顶层窗口的窗口部件层次结构中放置一个使用 Vulkan 的 QQuickWidget 和一个QOpenGLWidget ,就会出现问题,其中一个窗口部件将无法按预期进行渲染。
场景图和上下文持久性
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透明不会导致预期的结果:下面的窗口小部件将不可见。这是因为在实践中,QQuickWidget的绘制要早于所有其他常规的非OpenGL窗口小部件,因此透明类型的解决方案并不可行。其他类型的布局,如在 QQuickWidget 的顶部安装 widget,将按预期运行。
在绝对必要的情况下,可以通过在 QQuickWidget 上设置Qt::WA_AlwaysStackOnTop 属性来克服这一限制。但要注意,这样做会破坏堆叠顺序。例如,就无法在 QQuickWidget 的顶部放置其他部件,因此只有在需要一个半透明的 QQuickWidget,而其他部件在其下方可见的情况下才能使用。
这一限制仅适用于同一窗口中的 QQuickWidget 下方有其他窗口小部件的情况。让窗口半透明,背景中可见其他应用程序和桌面,可以用传统方法实现:在顶层窗口中设置Qt::WA_TranslucentBackground ,请求一个 alpha 通道,并通过setClearColor() 将Qt Quick 场景图的透明色更改为Qt::transparent 。
Tab 键处理
按下[TAB]
键时,QQuickWidget 中的项目将获得焦点。如果该项目可以处理[TAB]
键的按下,则项目内的焦点会相应改变,否则焦点链中的下一个窗口小部件会获得焦点。
另请参阅 将 C++ 类型的属性公开到 QML、Qt Quick Widget 示例和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 : const Status
组件的当前status 。
访问功能:
QQuickWidget::Status | status() const |
Notifier 信号:
void | statusChanged(QQuickWidget::Status status) |
成员函数文档
[explicit]
QQuickWidget::QQuickWidget(QWidget *parent = nullptr)
构造一个带有默认 QML 引擎的 QQuickWidget,作为parent 的子节点。
parent 的默认值是nullptr
。
QQuickWidget::QQuickWidget(QQmlEngine *engine, QWidget *parent)
用给定的 QMLengine 作为parent 的子对象构建一个 QQuickWidget。
注意: QQuickWidget 并不拥有给定的engine 对象;销毁引擎是调用者的责任。如果engine 在视图之前被删除,status() 将返回QQuickWidget::Error 。
[explicit]
QQuickWidget::QQuickWidget(const QUrl &source, QWidget *parent = nullptr)
用默认的 QML 引擎和给定的 QMLsource 作为parent 的子节点构造一个 QQuickWidget。
parent 的默认值是nullptr
。
[explicit, since 6.9]
QQuickWidget::QQuickWidget(QAnyStringView uri, QAnyStringView typeName, QWidget *parent = nullptr)
用uri 和typeName 指定的元素以及父对象parent 构建一个 QQuickWidget。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 。如果您想使用QQuickWindow API,而QQuickWidget 当前并未公开这些 API,例如,连接到QQuickWindow::beforeRendering() 信号,以便在Qt Quick'自己的渲染下面绘制本地 OpenGL 内容,这将非常有用。
警告: 请谨慎使用此函数的返回值。特别是,请勿尝试显示QQuickWindow ,并且在使用其他仅限QWindow 的 API 时务必小心。
警告: 在QQuickWidget 的生命周期内,屏幕外窗口可能会被删除(和重新创建),尤其是当窗口小部件被移动到另一个QQuickWindow 时。如果您需要知道窗口何时被替换,请连接其destroyed() 信号。
QQmlContext *QQuickWidget::rootContext() const
该函数返回上下文层次结构的根。每个 QML 组件都在QQmlContext 中实例化。QQmlContext's 是向 QML 组件传递数据的关键。在 QML 中,上下文按层次排列,这种层次结构由QQmlEngine 管理。
QQuickItem *QQuickWidget::rootObject() const
返回视图的根item 。如果setSource() 未被调用、调用时使用了已损坏的QtQuick 代码或正在创建QtQuick 内容,则返回值可能为空。
[signal]
void QQuickWidget::sceneGraphError(QQuickWindow::SceneGraphError error, const QString &message)
当场景图初始化过程中出现error 时,将发出该信号。
如果应用程序希望以自定义方式处理错误(如 OpenGL 上下文创建失败),则应连接到此信号。如果没有槽连接到该信号,行为将有所不同:Quick 将打印message 或显示消息框,并终止应用程序。
该信号将从图形用户界面线程中发出。
另请参见 QQuickWindow::sceneGraphError().
void QQuickWidget::setClearColor(const QColor &color)
设置透明color 。默认情况下,这是一种不透明的颜色。
要获得半透明的QQuickWidget ,请在将color 设置为Qt::transparent 的情况下调用此函数,在顶层窗口上设置Qt::WA_TranslucentBackground widget 属性,并通过setFormat() 申请 alpha 通道。
另请参阅 QQuickWindow::setColor()。
void QQuickWidget::setFormat(const QSurfaceFormat &format)
设置此部件使用的上下文和离屏表面的表面format 。
当需要为给定的 OpenGL 版本或配置文件请求上下文时,请调用此函数。深度、模板和 alpha 缓冲区的大小会自动处理,无需明确请求。
另请参见 QWindow::setFormat()、QWindow::format() 和format()。
[slot, since 6.9]
void QQuickWidget::setInitialProperties(const QVariantMap &initialProperties)
设置 QML 组件在调用QQuickWidget::setSource() 后初始化的初始属性initialProperties 。
注意: 你只能用这个函数来初始化顶层属性。
注意: 此函数应始终在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。
注: 属性源的获取函数。
另请参阅 setSource().
[signal]
void QQuickWidget::statusChanged(QQuickWidget::Status status)
该信号在组件当前status 发生变化时发出。
注: 属性status 的通知信号。
[override virtual protected]
void QQuickWidget::wheelEvent(QWheelEvent *e)
重实现:QWidget::wheelEvent(QWheelEvent *event).
© 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.