Qt 在QQuickWidget中显示QQmlComponent

Qt 在QQuickWidget中显示QQmlComponent,qt,qtquick2,Qt,Qtquick2,根据QQuickWidget的: 您可以使用QQmlComponent和place实例化自己的对象 在手动设置的QQuickWidget中创建它们 但我找不到任何这样的例子。我希望将多个QQmlComponents加载到RAM中,并在QQuickWidget中显示它们,具体取决于哪个是活动的。关于如何在QQuickWidget中显示除setSource()之外的任何内容,您有什么想法吗 我最终得到了以下解决方案:创建新的QQuickWidget小部件,并使用其QQuickWidget::setC

根据QQuickWidget的:

您可以使用QQmlComponent和place实例化自己的对象 在手动设置的QQuickWidget中创建它们


但我找不到任何这样的例子。我希望将多个QQmlComponents加载到RAM中,并在QQuickWidget中显示它们,具体取决于哪个是活动的。关于如何在QQuickWidget中显示除setSource()之外的任何内容,您有什么想法吗

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

注意:
setContent()
internal一样,虽然此API是公共的,并且可以在公共标题中使用,但也有一些缺点

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

其次,
QQuickWidget
认为它拥有通过
QQuickWidget::setContent()
传递的指针,并试图在销毁时删除内容。要绕过此问题,您可以在销毁实例之前执行
QQuickWidget::setContent(qrl(),nullptr,nullptr)
。但这会从标准输出中的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();

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

是否要在不使用setSource()的情况下加载QQmlComponent?是的,因为setSource仅与文件名/URL一起工作创建QQmlComponent时,必须向其传递QQmlEngine,如果你想在QQuickWidget中显示它,你必须通过QQuickWidget的QQmlEngine:取决于哪个是活动的有什么意义?我的意思是,在某个地方会有QComboBox,它定义了在QuickWidget中显示哪个组件。我刚刚找到了应该这样做的
QQuickWidget::setContent()
。但由于某些原因,它的文档被隐藏(QTBUG-59220)。。。测试它。。