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