是否可以QQuickwidget::setSource()
与变量(QString 或 QByteArray)一起使用?
我知道我可以加载文件(或资源):ui->quickWidget->setSource(QUrl::fromLocalFile(":/qml/Example.qml"));
但是,如果我将 qml 代码存储在变量中,我只能通过首先写入磁盘上的文件并加载该文件来解决它。可以直接做吗?
是否可以QQuickwidget::setSource()
与变量(QString 或 QByteArray)一起使用?
我知道我可以加载文件(或资源):ui->quickWidget->setSource(QUrl::fromLocalFile(":/qml/Example.qml"));
但是,如果我将 qml 代码存储在变量中,我只能通过首先写入磁盘上的文件并加载该文件来解决它。可以直接做吗?
也许在临时文件的帮助下?
https://doc.qt.io/qt-5/qtemporaryfile.html
像这样的事情(我没有太多时间,所以我只是做了一些肮脏的事情):
QQmlApplicationEngine engine;
QString qmlFile =
QString("import QtQuick 2.15\n")
.append("import QtQuick.Window 2.12\n")
.append("import QtQuick.Controls 2.12\n")
.append("Window {\n")
.append("id: root\n")
.append("width: 640\n")
.append("height: 480\n")
.append("visible: true\n")
.append("color: 'green'\n")
.append("}");
QTemporaryFile file;
if(file.open())
{
file.write(qmlFile.toUtf8());
}
file.close();
engine.load(file.fileName());
如果您选择文件方法,请考虑使用Qt Resource System。我写了一个很好的例子。但你不必这样做。另一种可能的方法是QQmlNetworkAccessManagerFactory,您可以在其中模拟从网络加载 qml,但从字符串加载它,但您可以从任何地方加载它,例如从 .zip 文件。最后,似乎有一种直接的方法,不要忘记你可以从QML 本身做同样的事情。