在QQuickWidget中显示QQmlComponent

时间:2018-08-06 14:31:20

标签: qt qtquick2

根据QQuickWidget的documentation

  

您可以使用QQmlComponent实例化自己的对象并放置   它们是通过手动设置的QQuickWidget来实现的。

但是我找不到任何示例。我想将多个QQmlComponents加载到RAM中,并根据活动的哪个在QQuickWidget中显示它们。关于如何在QQuickWidget中显示除setSource()以外的任何内容的任何想法?

1 个答案:

答案 0 :(得分:0)

我最终得到了以下解决方案:创建新的QQuickWidget小部件并使用其QQuickWidget::setContent()在其中显示已创建的QML内容。它可以在我的Qt 5.9中使用。

注意:setContent()marked内部,尽管此API是公共的并且可以在公共标头中使用,但也有一些缺点。

首先,因此QQuickWidget被调用以获取不同数据时,QQuickWidget::setContent()不会清除其内容。因此,新旧内容重叠。这就是为什么我必须在每次内容更改时都创建一个新的QQuickWidget,并用新的新内容替换旧的QQuickWidget

其次,QQuickWidget认为它拥有通过QQuickWidget::setContent()传递的指针,并试图在销毁时删除内容。要绕过此操作,您可以在QQuickWidget::setContent(QUrl(), nullptr, nullptr)实例销毁之前执行QQuickWidget。但这会在标准输出中触发来自QML引擎的警告消息,提示错误的qml内容。因此,更好的方法是设置虚拟数据:

QQmlComponent* dummy = new QQmlComponent(engine);
dummy->setData(QByteArray("import QtQuick 2.0; Item { }"), QUrl());
wgt->setContent(dummy->url(), dummy, dummy->create());
wgt->deleteLater();

借助这些技巧,我可以在运行时使用QQmlComponent加载多个QML对象(具有自己的UI的插件)。实例化它们,并根据所选插件在基于QWidgets的应用程序中显示其中之一。