一个QML作为主页面的软件,它的主QML页面加载有两种方式,一种是利用QQuickView作为容器加载,另一种是使用 QQmlApplicationEngine引擎加载。下面就详细看下这两种方式。
方式1,使用qmlengine加载#include#include int main(int argc, char *argv[]) { QGuiApplication app(argc, argv); QQmlApplicationEngine engine; const QUrl url(QStringLiteral("qrc:/main.qml")); QObject::connect(&engine, &QQmlApplicationEngine::objectCreated, &app, [url](QObject *obj, const QUrl &objUrl) { if (!obj && url == objUrl) QCoreApplication::exit(-1); }, Qt::QueuedConnection); engine.load(url); return app.exec(); }
注意此方式加载的QML文件的跟节点一定要是个Window,即窗体,因为QQmlApplicationEngine只是一个加载引擎,不负责窗体的创建和显示。有一种情况不需要根节点是Window,那就是你的程序没有GUI,不依赖QGuiApplication。
方式2,使用QQuickView加载 const QUrl url(QStringLiteral("qrc:/qml/main.qml"));
QQuickView *view = new QQuickView;
view->setSource(url);
view->show();
此方式加载的QML文件根节点不能是Window,因为QQuickView已经帮你创建了窗口,你的根节点可以是Rectangle或者Item。
个人认为这种方式最为灵活,可以通过m_qmlPlayer = qobject_cast
QmetaObject::invokeMethod(view, "show", Qt::QueuedConnection);
还有一点是在android低性能设备上发现,使用QQuickView的视频渲染效率是好于QQmlApplicationEngine的。



