小部件
Qt 数字广告被设计为一个 Qt Quick 插件,但是可以通过使用 Qt 小部件 解决方案来实现,这是通过使用 QQuickWidget 类实现的。
在本章中,我们将逐步指导您如何将 Qt Quick 广告嵌入到 Qt 小部件应用程序中。
示例
为了使您更容易了解我们的插件在 Qt 小部件应用程序中的应用,我们已完全重新制作了我们的 Qt Quick 示例,并将其作为 Qt 小部件应用程序。
Qt 小部件示例与嵌入式示例类似。有关更多信息,请参阅示例。
免责声明
由于本章中提出的解决方案严重依赖于 QQuickWidget,请参阅使用此类时施加的限制。
操作过程
在以下部分中,我们将提供用于 Qt 小部件应用程序的示例的详细操作过程。
首先,为了使用 QQuickWidget 类,必须启用 quickwidgets
模块(例如,qmake 的 QT += quickwidgets
)。
启用 quickwidgets
模块后,可以实例化 QQuickWidget 对象。
advWidget = new QQuickWidget();
要实例化 QML 对象,必须提供其定义作为单独的 QML 文件,例如
import QtQuick 2.0 import QtDigitalAdvertising 2.0 BannerAd{ adUnitId: "/6499/example/banner" bannerType: BannerAd.BANNER }
如您所见,提供的 QML 代码非常简单,就像 JSON 配置文件一样简单。
准备好 QML 文件后,可以通过在 QQuickWidget 对象上设置源来实例化 QML 对象。确保提供的 URL 完整且正确。
advWidget->setSource(QUrl::fromLocalFile(":/adv.qml"));
此时,广告项应该完全可用。有关如何与此项交互的信息,请参见以下部分。
注意:设置源 URL 将导致 QML 组件被实例化,即使该 URL 与当前值没有变化。
可选功能
QML 项
可以通过 QQuickWidget::rootObject() 获取实例化的 QML 项。
返回的项指针可以用作各种功能的对象引用,例如:操作属性、调用方法、连接槽/信号。
有关更多信息,请参阅以下部分。
QML 属性
可以通过 C++ 操作实例化 QML 项的属性,就像 Qt Quick 设计的那样。
为了实现这一点,必须首先包含 QQuickItem 标头
#include <QQuickItem>
然后可以更改项目的属性,例如
advWidget->rootObject()->setProperty("bannerType", 1);
这样,名为 displayMode
的 QML 项属性将设置为 Loop
。
QML 方法
根据Qt Quick的设计,可以通过C++调用实例化的QML项目的方法。
为使其成为可能,首先需要包含QMetaObject头文件。
然后可以调用QML方法,例如
QMetaObject::invokeMethod(advWidget->rootObject(), sceneIndex == MainScene ? "stop" : "play");
这样QML项将调用play
或pause
方法。
QML信号
根据Qt Quick的设计,可以通过C++连接到实例化的QML项的信号。
为此,必须使用旧的连接语法,例如
connect(advWidget->rootObject(), SIGNAL(loaded()), this, SLOT(onLoaded()));
这样,每当QML项发出关于广告结束的信号时,都会调用一个onAdvEnded
槽。
调整模式
可以通过Qt Widget布局等来管理QML项的大小,以便将其设置为以下调整模式
advWidget->setResizeMode(QQuickWidget::SizeRootObjectToView);
这样,QML项的大小将由视图(布局)管理;否则,大小将基于QML代码。
注意事项
OpenGL
由于QQuickWidget严重依赖OpenGL,有时必须显式地将图形API设置为OpenGL。
QQuickWindow::setGraphicsApi(QSGRendererInterface::OpenGL);
透明清除颜色
由于QQuickWidget的限制,设置广告项透明清除颜色相当复杂。
advWidget->setClearColor(Qt::transparent); advWidget->setAttribute(Qt::WA_AlwaysStackOnTop, sceneIndex != FullScene && sceneIndex != InlineScene); advWidget->setAttribute(Qt::WA_TranslucentBackground, sceneIndex != FullScene && sceneIndex != InlineScene);
这样,对于除全屏和内联之外的场景,广告项将具有透明清除颜色。
透明清除颜色需要设置始终保持在顶部标志或在单独的窗口中设置项。
有关更多信息,请参阅QQuickWidget的限制。
枚举值
由于Qt Digital Advertising是一个仅适用于QML的插件,没有相关的枚举可用于C++,但可以使用数字值,例如
advWidget->rootObject()->setProperty("bannerType", 1);
请参阅QML类型参考以获取插件枚举的数字值(第一个枚举值从零开始)。
©2024 The Qt Company Ltd. 本文档中的文档贡献是他/她的 respective owners的所有权。提供的文档根据GNU自由文档许可版1.3的条款进行许可,由自由软件基金会发布。Qt和相应的徽标是芬兰及其它在世界各地的商标。所有其他商标均为其相应所有者的财产。