关于qt:Qt小知识-用一篇小短文带你进入-QML-的美妙世界

37次阅读

共计 3566 个字符,预计需要花费 9 分钟才能阅读完成。

大家好,我是老吴。

明天用几个小例子带大家疾速入门 QML 编程。

0. 什么是 QML?

QML 是一种用于形容应用程序用户界面的申明式编程语言,Qt Quick 则是 QML 利用的规范库。

我为什么抉择学习 QML?

易上手;

可读性高;

学习材料多,有各种文档和示例;

跨平台;

性能不差,晦涩度还行。

1. 如何创立 QML 利用?

举个栗子:

在 Qt Creator 顺次点击:

-> File -> New File or Project

-> Applications -> Qt Quick Application

而后一路点击 next 直到 finish。

批改 main.qml:

`// 文件 main.qml`
`import QtQuick 2.12`
`import QtQuick.Window 2.12`
`Window {`
 `visible: true`
 `width: 320`
 `height: 240`
 `title: qsTr("Hello World")`
 `Rectangle {`
 `width: 320`
 `height: 240`
 `color: "green"`
 `Text {`
 `anchors.centerIn: parent`
 `text: "Hello, World!"`
 `}`
 `}`
`}`

这样就实现了你的第一个 QML 程序,它的作用是在一个绿色的长方形块上显示 “Hello World!”。

运行成果:

这里的 Window、Rectangle、Text 都是 QML 里的类型,术语 为 QML Type。

进一步理解 QML Type:

The QML Type System

QML Basic Types

QML Object Types

2. 应用 Qt Quick Controls

什么是 Qt Quick Controls?

Qt Quick Controls 就是一组控件,用于在 Qt Quick 中构建残缺的界面。

举个例子:

`// 文件 main.qml`
`import QtQuick 2.12`
`import QtQuick.Controls 2.12`
`ApplicationWindow {`
 `visible: true`
 `title: qsTr("Hello World")`
 `width: 320`
 `height: 240`
 `menuBar: MenuBar {`
 `Menu {`
 `title: qsTr("File")`
 `MenuItem {`
 `text: qsTr("&Open")`
 `onTriggered: console.log("Open action triggered");`
 `}`
 `MenuItem {`
 `text: qsTr("Exit")`
 `onTriggered: Qt.quit();`
 `}`
 `}`
 `}`
 `Button {`
 `text: qsTr("Hello World")`
 `anchors.horizontalCenter: parent.horizontalCenter`
 `anchors.verticalCenter: parent.verticalCenter`
 `}`
`}`

这里的 ApplicationWindow、MenuBar、Button 首先是 QML Type,并且它们是 Qt Quick Controls 里提供的控件。

  • ApplicationWindow 是一个通用的窗口控件;
  • MenuBar 是一个菜单栏控件;
  • Button 是按键控件;

运行成果:

进一步理解 Qt Quick Controls:

Qt Quick Layouts – Basic Example

Qt Quick Controls – Gallery

3. 解决用户输出

应用 QML 设计界面的一大长处是,

它容许设计人员应用简略的 JavaScript 表达式定义应用程序对事件的反馈。

在 QML 中,咱们将事件称为信号,并且这些信号由信号处理程序处理。

举个例子:

`// 文件 main.qml`
`ApplicationWindow {`
 `...`
 `Rectangle {`
 `width: 100`
 `height: 100`
 `color: "red"`
 `anchors.verticalCenter: parent.verticalCenter`
 `Text {`
 `anchors.centerIn: parent`
 `text: "Hello, World!"`
 `}`
 `TapHandler {`
 `onTapped: parent.color = "green"`
 `}`
 `}`
`}`

运行成果:

TapHandler 用于响应触摸屏或者鼠标的点击,这里咱们应用它来解决对绿色方块的点击事件。

进一步了事件处理:

Signal and Handler Event System

4. 属性绑定

什么是属性绑定?

对象及其属性形成了 QML 文件中定义的图形界面的根底。

QML 容许属性彼此之间以各种形式绑定,从而实现高度动静的用户界面。

举个例子:

`// 文件 main.qml`
`ApplicationWindow {`
 `Rectangle {`
 `width: 100`
 `height: 100`
 `color: "red"`
 `Rectangle {`
 `width: parent.width / 2`
 `height: parent.height / 2`
 `color: "green"`
 `}`
 `}`
`}`

运行成果:

子矩形的长宽绑定了到父矩形的几何形态。

如果父矩形的长宽发生变化,则因为属性绑定,子矩形的长宽将自动更新。

5. 自定义 QML Type

每个 QML 文件都隐式地定义了一个 QML type,这个 QML type 能够在其余 QML 文件中重复使用。

举个例子:

新建一个 QML 文件 MessageLabel.qml:

`// 文件 MessageLabel.qml`
`import QtQuick 2.12`
`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"`
 `}`
 `}`
`}`

这里能够了解为咱们创立了一个名为 MessageLabel 的控件。

援用 MessageLabel:

`// 文件 main.qml`
`Window {`
 `...`
 
 `Column {`
 `...`
 `MessageLabel{`
 `width: parent.width - 2`
 `msgType: "debug"`
 `}`
 `MessageLabel {`
 `width: parent.width - 2`
 `message: "This is a warning!"`
 `msgType: "warning"`
 `}`
 `MessageLabel {`
 `width: parent.width - 2`
 `message: "A critical warning!"`
 `msgType: "critical"`
 `}`
 `}`
`}`

运行成果:

咱们很不便地就结构了一个名为 MessageLabel 的控件,用于实现不同等级的 log 打印。

到这里,置信你曾经进入了 QML 编程的世界了,请开始你本人的探索之旅吧。

—— The End ——

举荐浏览:

专辑 | Linux 驱动开发

专辑 | Linux 零碎编程

专辑 | 每天一点 C

专辑 | Qt 入门

想进交换群?

后盾回复【加群】,我拉你进群。

正文完
 0