在我们的项目中,我们对 QML 源代码进行了 C++ 单元测试。它使用以下代码动态加载组件以进行进一步处理
class MyTest {
...
QScopedPointer<QQuickWidget> quickWidget;
QQuickItem* root = nullptr;
void setQmlSource(const QString& source)
{
quickWidget.reset(new QQuickWidget);
quickWidget->rootContext()->engine()->addImportPath("qrc:/qml");
quickWidget->setSource(QUrl::fromUserInput(source));
root = quickWidget->rootObject();
}
}
对于像这样的 qml 组件工作正常:
我的.qml:
Rectangle {
...
}
但是,当我将组件包装到Dialog
Dialog {
...
Rectangle {
...
}
}
它停止工作:
错误:
QQuickWidget
仅支持加载从QQuickItem
.
这是预期Dialog
的QQuickWindow
。但是尝试像这样加载QQuickItem
https://doc.qt.io/qt-5/qquickview.html#details :QQuickView
void MyTest::setQmlWindow(const QString& source)
{
QQuickView *view = new QQuickView;
view->rootContext()->engine()->addImportPath("qrc:/qml");
view->setSource(QUrl::fromUserInput(source));
root = view->rootObject();
}
也因上述错误而失败。QQmlApplicationEngine
并通过这里加载https://stackoverflow.com/a/23936741/630169:
void MyTest::setQmlWindow(const QString& source)
{
engine = new QQmlApplicationEngine;
//engine->addImportPath("qrc:/qml");
engine->load(QUrl::fromUserInput(source));
QObject *myObject = engine->rootObjects().first();;
QQuickWindow *window = qobject_cast<QQuickWindow*>(myObject);
root = window->contentItem();
}
失败并出现另一个错误:
QQmlApplicationEngine
未能加载组件
QWARN:未安装模块“” QWARN:未MyTest::myMethodTest()
安装 模块“ ” ...mynamespace.mymodule
MyTest::myMethodTest()
mynamespace.mymodule
为什么为itemview->setSource()
正确加载此模块而无法为同一 item qml 源执行但包装到?Rectangle
QQmlApplicationEngine
Dialog
注意:这些模块是 C++ 并且可以很好地加载
view->setSource()
.
如果我尝试通过QQmlComponent
文档中提到的方式使用和加载:https ://doc.qt.io/qt-5/qqmlcomponent.html#details :
void MyTest::setQmlWindow(const QString& source)
{
engine = new QQmlApplicationEngine;
//engine->addImportPath("qrc:/qml");
QQmlComponent *component = new QQmlComponent(engine, QUrl::fromUserInput(source));
component->loadUrl(QUrl::fromUserInput(source));
QQuickWindow *window = qobject_cast<QQuickWindow*>(component->create());
root = window->contentItem();
}
- 然后有另一个错误:
QQmlComponent
: 组件没有准备好
ifengine->addImportPath()
没有被调用,并崩溃
位置:[未知文件(0)]
engine->addImportPath()
调用时出错。
如何正确加载Dialog
( QQuickWindow
) 并在 C++ 中获取 rootQQuickItem
以进行测试?有任何想法吗?谢谢!