官文:https://doc.qt.io/qt-6/qmlfirststeps.html

1. 创建 QML 文档

QML 文档定义了具有高度可读性、结构化布局的对象层次结构。每个 QML 文档由两部分组成:导入部分、对象声明部分。

1.1 导入和使用 QtQuick 模块

  1. import QtQuick

要使用 Qt Quick 模块,需要导入一个 QML 文档,如上所示。Qt Quick 提供的类型和功能现在可以在 QML 文档中使用了!

1.2 定义对象层次结构

对象声明定义了将在视觉场景中显示的内容。Qt Quick 提供了基本构建块,例如用于显示图像和文本以及处理用户输入的对象。例如,声明一个带有一些文本居中的彩色矩形:

  1. Rectangle {
  2. width: 200
  3. height: 100
  4. color: "red"
  5. Text {
  6. anchors.centerIn: parent
  7. text: "Hello, World!"
  8. }
  9. }

这定义了一个对象,根为 Rectangle 对象,且根还有一个 Text 对象。Text 的父对象自动设置为 Rectangle,类似地,Text 也会添加到 Rectangle 的 children 属性中。

1.3 把它放在一起

上例中使用的 Rectangle 和 Text 类型均由 QtQuick 导入提供。将导入和对象声明放在一起,我们得到一个完整的 QML 文档。如果我们将该文档保存为“HelloWorld.qml”,我们就可以加载并显示它。

  1. import QtQuick
  2. Rectangle {
  3. width: 200
  4. height: 100
  5. color: "red"
  6. Text {
  7. anchors.centerIn: parent
  8. text: "Hello, World!"
  9. }
  10. }

2. 创建和运行 QML 项目

使用 Qt Creator 加载 QML 文档定义的图形场景。从 Qt Creator 中选择 File > New File or Project > Application (Qt Quick) > Qt Quick Application - Empty。点击绿色运行按钮运行程序,就会看到在一个红色矩形中心显示 Hello, World!文本。

有关在 Qt Creator 中创建和运行项目的更多信息,请访问以下页面:

  • Creating Qt Quick Projects
  • Building and Running an Example

    3. 使用控件创建 QML 应用程序

    Qt Quick 提供基本的图形元素,而 Qt Quick Controls 提供现成的 QML 类型。插入 ApplicationWindow 类型是创建应用程序的一个很好的起点。程序 UI 具有以下基本布局:
    image.png
    在每个区域内,可以添加和连接不同的 controls(控件)以形成应用程序。例如,以下代码是一个演示可用空间使用情况的基本程序: ```javascript //导入模块 import QtQuick import QtQuick.Controls

//window containing the application ApplicationWindow {

  1. //标题
  2. title: qsTr("Hello World")
  3. width: 640
  4. height: 480
  5. //menu包含了两个菜单项
  6. menuBar: MenuBar {
  7. Menu {
  8. title: qsTr("File")
  9. MenuItem {
  10. text: qsTr("&Open")
  11. onTriggered: console.log("Open action triggered");
  12. }
  13. MenuItem {
  14. text: qsTr("Exit")
  15. onTriggered: Qt.quit();
  16. }
  17. }
  18. }
  19. //内容区域
  20. //内容区域中的一个按钮
  21. Button {
  22. text: qsTr("Hello World")
  23. anchors.horizontalCenter: parent.horizontalCenter
  24. anchors.verticalCenter: parent.verticalCenter
  25. }

}

  1. 该程序有两个菜单项和一个中间的按钮。单击 **Exit **菜单项关闭应用程序。
  2. 还有不同的导航方法和不同的控件,例如按钮和滑块。以下示例可从 Qt Creator 获得并演示不同的控件和布局。
  3. - [Basic Layouts](https://doc.qt.io/qt-6/qtquick-layouts-example.html)
  4. - [Qt Quick Controls - Gallery](https://doc.qt.io/qt-6/qtquickcontrols-gallery-example.html)
  5. <a name="E9HbE"></a>
  6. # 4. 处理用户输入
  7. 使用 QML 定义用户界面的一大优势是:它允许开发者定义应用程序应如何使用简单的 JavaScript 表达式对事件做出反应。在 QML 中,我们将这些事件称为 [signals](https://doc.qt.io/qt-6/qtqml-syntax-signals.html)(信号),这些信号由 [signal handlers](https://doc.qt.io/qt-6/qtqml-syntax-signals.html#qml-signals-and-handlers)(信号槽)处理。
  8. 示例:
  9. ```javascript
  10. import QtQuick
  11. Rectangle {
  12. width: 200
  13. height: 100
  14. color: "red"
  15. Text {
  16. anchors.centerIn: parent
  17. text: "Hello, World!"
  18. }
  19. TapHandler {
  20. onTapped: parent.color = "blue"
  21. }
  22. }

此示例可以保存为“ClickableHelloWorld.qml”并使用 qml 运行时工具运行。每当用户单击窗口中的任意位置时,矩形就会从红色变为蓝色。

注意:TapHandler 还为触摸事件发出 tapped 信号,因此此代码也适用于移动设备。

键盘用户输入可以用一个简单的表达式类似地处理:

  1. Rectangle {
  2. width: 200
  3. height: 100
  4. color: "red"
  5. Text {
  6. anchors.centerIn: parent
  7. text: "Hello, World!"
  8. }
  9. focus: true
  10. Keys.onPressed: {
  11. if (event.key == Qt.Key_Return) {
  12. color = "blue";
  13. event.accepted = true;
  14. }
  15. }
  16. }

通过接受焦点,无论何时按下返回键,颜色都可以更改为蓝色。

5. 属性绑定

对象及其属性构成了界面的基础。QML 语言允许属性以各种方式相互绑定,从而实现高度动态的用户界面。

在以下示例中,如果父 Rectangle 的几何形状发生变化,由于属性绑定,每个子 Rectangle 的几何形状将自动更新。

  1. Rectangle {
  2. width: 400
  3. height: 200
  4. Rectangle {
  5. width: parent.width / 2
  6. height: parent.height
  7. }
  8. Rectangle {
  9. width: parent.width / 2
  10. height: parent.height
  11. x: parent.width / 2
  12. }
  13. }

6. 动画

也可以通过动画动态更新属性。QtQuick 提供了各种动画类型,可用于对属性值的更改进行动画处理。在以下示例中,一个属性被动画化,然后显示在文本区域中:

  1. Rectangle {
  2. color: "lightgray"
  3. width: 200
  4. height: 200
  5. property int animatedValue: 0
  6. SequentialAnimation on animatedValue {
  7. loops: Animation.Infinite
  8. PropertyAnimation { to: 150; duration: 1000 }
  9. PropertyAnimation { to: 0; duration: 1000 }
  10. }
  11. Text {
  12. anchors.centerIn: parent
  13. text: parent.animatedValue
  14. }
  15. }

显示的值会周期性地从 0 到 150 变化。

7. 定义自定义 QML 类型以供重用

QML 中最重要的概念之一是类型重用。一个程序可能有多个相似的视觉类型(例如,多个按钮),而 QML 允许将这些类型的东西定义为可重用的自定义类型,以最大限度地减少代码重复并最大限度地提高可读性。

例如,假设开发人员在 MessageLabel.qml 文件中定义了一个新的 MessageLabel 类型:

  1. // MessageLabel.qml
  2. import QtQuick
  3. Rectangle {
  4. height: 50
  5. property string message: "debug message"
  6. property var msgType: ["debug", "warning" , "critical"]
  7. color: "black"
  8. Column {
  9. anchors.fill: parent
  10. padding: 5.0
  11. spacing: 2
  12. Text {
  13. text: msgType.toString().toUpperCase() + ":"
  14. font.bold: msgType == "critical"
  15. font.family: "Terminal Regular"
  16. color: msgType === "warning" || msgType === "critical" ? "red" : "yellow"
  17. ColorAnimation on color {
  18. running: msgType == "critical"
  19. from: "red"
  20. to: "black"
  21. duration: 1000
  22. loops: msgType == "critical" ? Animation.Infinite : 1
  23. }
  24. }
  25. Text {
  26. text: message
  27. color: msgType === "warning" || msgType === "critical" ? "red" : "yellow"
  28. font.family: "Terminal Regular"
  29. }
  30. }
  31. }

现在可以在应用程序中多次重复使用该类型,如下所示:

  1. // application.qml
  2. import QtQuick
  3. Column {
  4. width: 180
  5. height: 180
  6. padding: 1.5
  7. topPadding: 10.0
  8. bottomPadding: 10.0
  9. spacing: 5
  10. MessageLabel{
  11. width: parent.width - 2
  12. msgType: "debug"
  13. }
  14. MessageLabel {
  15. width: parent.width - 2
  16. message: "This is a warning!"
  17. msgType: "warning"
  18. }
  19. MessageLabel {
  20. width: parent.width - 2
  21. message: "A critical warning!"
  22. msgType: "critical"
  23. }
  24. }

有关如何开发可重用组件的详细信息,请参阅 QML Object Attributes

8. 下一步

既然您已经看到了 QML 的实际应用,您就可以开始下一步了。 以下页面将引导您踏上 QML 之旅。