由于項目原因,最近要進行qml相關開發,我之前也沒有搞過qml,因此開一個qml系列的專欄,記錄自己關于qml的相關學習
新建第一個qml工程
按如下圖所示方法新建一個最簡單的qml工程:
編譯運行
可以看到是一個標題為“hello word”沒有任何內容的空白窗體。
代碼解析
main.cpp
#include <QGuiApplication>
#include <QQmlApplicationEngine>int main(int argc, char *argv[])
{
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
#endifQGuiApplication 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();
}
可以看到與傳統QWidget工程相比關鍵不同的是這一部分:
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);
如果是QWidget工程這里一般是聲明一個窗體比如QWidget然后show()顯示。這里有一個很關鍵的QQmlApplicationEngine類,QML中最關鍵的也是這個QQmlApplicationEngine。
QQmlApplicationEngine 的核心作用
這段代碼是 Qt Quick 應用程序的入口核心,與傳統QWidget w,w.show()有本質區別。QQmlApplicationEngine負責加載 QML 文件并構建完整的應用程序對象樹。比如上面代碼engine.load(url)。這是一個QML引擎。
QML 引擎初始化流程
引擎實例化
QQmlApplicationEngine?engine;
?創建 QML 引擎,負責解析 QML 文件、管理組件生命周期和綁定 JavaScript 上下文。QML 資源定位
const QUrl url(QStringLiteral("qrc:/main.qml"))指定 QML 入口文件路徑。qrc表示從 Qt 資源系統加載,避免文件路徑依賴問題。對象創建回調
綁定引擎的信號,用于檢測根組件是否成功加載。若失敗(!obj
?且 URL 匹配),則強制退出應用。啟動 QML 渲染
前面都是準備工作,最后關鍵一步engine.load(url)最終觸發 QML 文件的解析和渲染,生成可視化界面。
main.qml
import QtQuick 2.15
import QtQuick.Window 2.15Window {width: 640height: 480visible: truetitle: qsTr("Hello World")
}
QtQuick 2.15
:導入基礎 Qt Quick 模塊,包含創建 UI 所需的核心類型QtQuick.Window 2.15
:提供窗口管理功能,包含 Window 類型
這里就有一個疑問為什么是2.15,別的行不行?
QtQuick 和 QtQuick.Window 的版本號(如2.15)與Qt框架的版本發布周期相關。每個Qt版本會包含對應的Qt Quick模塊更新,版本號反映了模塊的兼容性和功能集。所以版本號并非隨意選擇,而是與Qt發行版中穩定的模塊版本一致。例如我使用的Qt版本是5.15.2。Qt 5.15.2中Qt Quick模塊的API版本為2.15。
然后下面部分就是定義了一個寬為640px,高為480px并且初始可見,標題為Hello World的window對象。
這里明顯就可以看出與傳統QWidget開發代碼的不同,QWidget 通過代碼顯式創建控件(命令式),而 QML 通過描述式語言定義界面(聲明式),由引擎動態生成對象。并且QWidget 直接操作原生窗口對象,QML 引擎則維護獨立的場景圖(Scene Graph),通過渲染線程優化性能。
以上就是關于新建的第一個qml工程的代碼解析,后續會進一步更新其他相關qml內容。