根据QQuickWidget的文档
您可以使用QQmlComponent实例化自己的对象,并将它们放在手动设置的QQuickWidget中。
但我找不到这方面的任何例子。我希望将多个QQmlComponents加载到内存中,并根据哪个是活动的,在QQuickWidget中显示它们。对于如何在QQuickWidget中显示除setSource()以外的任何内容,有什么想法吗?
发布于 2018-08-09 17:07:08
最后,我得到了以下解决方案:创建新的QQuickWidget小部件,并使用它的QQuickWidget::setContent()在其中显示已经创建的QML内容。它适用于我的Qt 5.9。
注意:setContent()是标上作为内部,虽然这个API是公开的,并且在公共头中可用,但也有一些缺点。
首先,当QQuickWidget因此需要不同的数据时,QQuickWidget::setContent()并不清楚它的内容。所以新旧内容重叠。这就是为什么我必须在每次更改内容时创建一个新的QQuickWidget,并用新的QQuickWidget替换旧的QQuickWidget。
其次,QQuickWidget认为它拥有通过QQuickWidget::setContent()传递的指针,并试图在销毁时删除内容。要绕过这一点,您可以在销毁QQuickWidget::setContent(QUrl(), nullptr, nullptr)实例之前执行QQuickWidget。但这会在stdout中触发来自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的插件)。实例化它们,并根据选择的插件在基于QWidget的应用程序中显示其中的一个。
https://stackoverflow.com/questions/51709987
复制相似问题