1. QML 入门 
1, QML 简介 
QML(Qt Meta-Object Language)是一种基于 JavaScript 的声明式语言,用于描述用户界面元素及其交互行为。
要使用 QML 需要安装 Qt 完整的发行版本。
QML 是声明式 UI,而 Widget 是命令式 UI。声明式 UI 是面向功能的,能够通过绑定来自动更新。
Qt Quick 是 QML 的 UI 框架,它提供了一套用于创建动画、视觉效果、转换和过渡的元素。
2. 创建项目 
安装 Qt 后,可以使用 Qt Creator 或者 Qt Design Studio 创建 QML 项目。本文以 Qt 6.6.0 为例。
QML 项目使用 .qmlproject 文件来管理项目,这个文件也是一个 QML 文件。
项目创建完成后,Qt 自动生成了一个 .qml 文件:
qml
import QtQuick
Window {
    width: 640
    height: 480
    visible: true
    title: qsTr("Hello World")
    Text {
        anchors.centerIn: parent
        text: qsTr("Hello World")
    }
}我们直接运行可以看到窗体,但是这个窗体并非此文件编译后的结果。而是运行了 qml 程序所渲染的结果。
我们使用一张图片填充背景:
qml
import QtQuick
Window {
    width: 640
    height: 480
    visible: true
    title: qsTr("Hello World")
    Image {
        id: background
        anchors.fill: parent
        source: "./images/2023-12-06_13-09-39_6154.png"
    }
}注意,最顶层的对象将先绘制。
下面我们再叠加一张图片,我们使用锚点属性 anchors 来定位。
qml
import QtQuick
Window {
    width: 640
    height: 480
    visible: true
    title: qsTr("Hello World")
    Image {
        id: background
        anchors.fill: parent
        source: "./images/bg.png"
        Image {
            anchors.bottom: parent.bottom
            anchors.horizontalCenter: parent.horizontalCenter
            id: wheel
            source: "./images/test2.jpg"
        }
    }
}下面我们实现点击选转图片:
qml
import QtQuick
Window {
    width: 640
    height: 480
    visible: true
    title: qsTr("Hello World")
    Image {
        id: background
        anchors.fill: parent
        source: "./images/bg.png"
        Image {
            anchors.bottom: parent.bottom
            anchors.horizontalCenter: parent.horizontalCenter
            id: wheel
            source: "./images/test2.jpg"
        }
        MouseArea {
            anchors.fill: parent
            onClicked: wheel.rotation += 30
        }
    }
}为了让动画更加流程,我们使用动画来过渡:
qml
import QtQuick
Window {
    width: 640
    height: 480
    visible: true
    title: qsTr("Hello World")
    Image {
        id: background
        anchors.fill: parent
        source: "./images/bg.png"
        Image {
            anchors.bottom: parent.bottom
            anchors.horizontalCenter: parent.horizontalCenter
            id: wheel
            source: "./images/test2.jpg"
            Behavior on rotation {
                NumberAnimation {
                    duration: 100
                }
            }
        }
        MouseArea {
            anchors.fill: parent
            onClicked: wheel.rotation += 30
        }
    }
}