QML入门指南

基本的QML应用程序开发示例

创建一个QML文档

QML 文档定义了一个具有高度可读性和结构化布局的对象层次结构。每个 QML 文档由两部分组成:导入部分和对象声明部分。用户界面中最常见的类型和功能在 QtQuick 导入中提供。

导入和使用QtQuick模块

要使用Qt Quick模块,QML文档需要导入它。导入语法如下所示:

Qt Quick 提供的类型和功能现在可以在 QML 文档中使用了!

定义对象层次结构

QML文档中的对象声明定义了将在视觉场景中显示的内容。Qt Quick提供了所有用户界面的基本构建块,例如用于显示图像和文本以及处理用户输入的对象。

一个简单的对象声明可能是一个带有一些居中文本的彩色矩形:

这定义了一个对象层次结构,其中包含一个根Rectangle对象,该对象有一个子Text对象。Text对象的parent自动设置为Rectangle,同样地,Text对象通过QML被添加到Rectangle对象的children属性中。

将所有内容整合在一起

上述示例中使用的Rectangle和Text类型均由QtQuick导入提供。将导入和对象声明放在一起,我们得到一个完整的QML文档:

如果我们将该文档保存为“HelloWorld.qml”,我们可以加载并显示它。

创建和运行QML项目

要显示由QML文档定义的图形场景,可以使用Qt Creator加载。对于像这样的简单UI文件,请在Qt Creator中选择文件 > 新建文件或项目 > 应用程序 (Qt Quick) > Qt Quick 应用程序 - 空

按下绿色的运行按钮来运行应用程序。你应该会在红色矩形的中心看到文本Hello, World!

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

使用控件创建QML应用程序

虽然Qt Quick提供了基本的图形元素,但Qt Quick Controls提供了现成的QML类型供应用程序使用。

插入ApplicationWindow类型是创建应用程序的一个良好起点。应用程序用户界面具有以下基本布局:

../_images/applicationwindow.png

在每个区域内,可以添加和连接不同的控件以形成一个应用程序。例如,以下代码片段是一个展示如何使用可用空间的基本应用程序:

应用程序有两个菜单项和一个中间的按钮。点击退出菜单项会关闭应用程序。

还有不同的导航方法和不同的控件,如按钮和滑块。以下示例可从Qt Creator中获得,并展示了不同的控件和布局。

  • 基本布局

  • Qt Quick Controls - 画廊

请随意复制并粘贴代码片段到这个简单的Hello World应用程序中,以了解QML的工作原理。

处理用户输入

使用QML定义用户界面的一个巨大优势是,它允许用户界面设计者通过简单的JavaScript表达式定义应用程序应如何对事件做出反应。在QML中,我们将这些事件称为信号,这些信号由信号处理器处理。

例如,考虑以下示例:

这个例子可以保存为“ClickableHelloWorld.qml”并使用qml运行,即QML Runtime Tool。每当用户点击窗口中的任何位置时,矩形将从红色变为蓝色。

注意

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

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

通过接受焦点,每当按下回车键时,颜色可以变为蓝色。

属性绑定

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

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

动画

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

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

定义可重用的自定义QML类型

QML中最重要的概念之一是类型的重用。一个应用程序可能会有多个相似的视觉类型(例如,多个按钮),QML允许将这些类型定义为可重用的自定义类型,以最小化代码重复并最大化可读性。

例如,想象开发者在MessageLabel.qml文件中定义了一个新的MessageLabel类型:

// MessageLabel.qml
import QtQuick

Rectangle {
    height: 50
    property string message: "debug message"
    property var msgType: ["debug", "warning" , "critical"]
    color: "black"

    Column {
        anchors.fill: parent
        padding: 5.0
        spacing: 2
        Text {
            text: msgType.toString().toUpperCase() + ":"
            font.bold: msgType == "critical"
            font.family: "Terminal Regular"
            color: msgType === "warning" || msgType === "critical" ? "red" : "yellow"
            ColorAnimation on color {
                running: msgType == "critical"
                from: "red"
                to: "black"
                duration: 1000
                loops: msgType == "critical" ? Animation.Infinite : 1
            }
        }
        Text {
            text: message
            color: msgType === "warning" || msgType === "critical" ? "red" : "yellow"
            font.family: "Terminal Regular"
        }
    }

}

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

// application.qml
import QtQuick

Column {
    width: 180
    height: 180
    padding: 1.5
    topPadding: 10.0
    bottomPadding: 10.0
    spacing: 5

    MessageLabel{
        width: parent.width - 2
        msgType: "debug"
    }
    MessageLabel {
        width: parent.width - 2
        message: "这是一个警告!"
        msgType: "warning"
    }
    MessageLabel {
        width: parent.width - 2
        message: "一个严重警告!"
        msgType: "critical"
    }
}
../_images/qml-extending-types.gif

通过这种方式,模块化的用户界面类型在应用程序中被组装和重用。

有关如何开发自己的可重用组件的更多详细信息,请参见QML对象属性。

接下来去哪里

现在你已经看到了QML的实际应用,你已经准备好迈出下一步了。接下来的页面将引导你在QML的旅程中前进。