根据QQuickWidget的documentation:
您可以使用QQmlComponent实例化自己的对象并放置 它们是通过手动设置的QQuickWidget来实现的。
但是我找不到任何示例。我想将多个QQmlComponents加载到RAM中,并根据活动的哪个在QQuickWidget中显示它们。关于如何在QQuickWidget中显示除setSource()以外的任何内容的任何想法?
答案 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的应用程序中显示其中之一。