1、QQmlApplicationEngined搭配 Window
示例:
#include <QGuiApplication> #include <QQmlApplicationEngine> int main(int argc, char *argv[]) { QGuiApplication app(argc, argv); QQmlApplicationEngine engine; engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); if (engine.rootObjects().isEmpty()) return -1; return app.exec(); }
這種方式是加載以 Window為跟對象的 QML 文件,QML 擁有窗口的完整控制權,可以直接設置標題、窗口尺寸等屬性。
2、QQuickView 搭配 Item
示例:
#include <QGuiApplication> #include <QQuickView> int main(int argc, char *argv[]) { QGuiApplication app(argc, argv); QQuickView *view = new QQuickView; view->setResizeMode(QQuickView::SizeRootObjectToView); view->setSource(QUrl(QStringLiteral("qrc:/main.qml"))); view->show(); return app.exec(); }
使用 QQuickView 顯示 QML 文件,對窗口的控制權(標題、窗口尺寸)是在 C++代碼中,QML 文件是以 Item (及 以Item為根的組件)作為根對象。
3、QQuickWidget 加載 QML【Item】
示例:
QQuickWidget *view = new QQuickWidget; view->setSource(QUrl::fromLocalFile("myqmlfile.qml")); view->show();
QQuickWidget是繼承於 QWidget 控件,這種方式主要是用於在 QWidget 界面上加載 QML 界面。
參考:https://blog.csdn.net/luoyayun361/article/details/77113516/
PS:
所以只有第一種是對窗口有絕對的控制權;
后面兩種的區別:
①、QQuickWidget的繼承自QWidget,可以直接添加到Qt布局中;
②、QQuickView繼承自QQuickWindow(繼承自QWindow),通過轉換才能添加到Qt布局中:
QQuickView *view = new QQuickView(); QWidget *widget = QWidget::createWindowContainer(view, this); view->setSource(QUrl("qrc:/main.qml"));
③、QQuickWidget因涉及渲染到render到OpenGL幀緩沖區對象,會帶來性能損失,導致較QQuickView性能稍低;
④、QQuickWidget將禁用所有平台上的線程render loop,例如Animator類和vsync驅動的動畫不能使用;
⑤、避免在QQuickWidget上調用winId(),這個函數會觸發本機窗口的創建,導致性能降低,並可能出現渲染問題;
故:
如主體項目為QWidget,QML只作為輔助,如完成一下顯示小動畫之類,那么請選擇QQuickWidget,可以更方便得與已有項目中的QWidget結合;
如項目為全新,不涉及到QWidget的歷史包袱,那么果斷選擇性能更好的QQuickView
參考:https://blog.csdn.net/qq_37996632/article/details/113284468
4、QQmlEngine + QQmlComponent
#include <QApplication> #include <QQmlEngine> #include <QQmlComponent> #include <QQuickWindow> #include <QDebug> int main(int argc, char *argv[]) { QApplication app(argc, argv); QQmlEngine engine; QQmlComponent *component = new QQmlComponent(&engine); QObject::connect(&engine, SIGNAL(quit()), QCoreApplication::instance(), SLOT(quit())); component->loadUrl(QUrl("qrc:/main.qml")); if (!component->isReady() ) { qWarning("%s", qPrintable(component->errorString())); return -1; } QObject *topLevel = component->create(); QQuickWindow *window = qobject_cast<QQuickWindow *>(topLevel); QSurfaceFormat surfaceFormat = window->requestedFormat(); window->setFormat(surfaceFormat); window->show(); return app.exec(); }
這種方式大多數地方都沒有寫,個人感覺沒必要使用。參考:https://blog.csdn.net/qq_34139994/article/details/105195447