Qt Quick 教程
最后修改于 2023 年 10 月 18 日
这是一个入门级的 Qt Quick 教程。本教程教授 Qt Quick 编程的基础知识。本教程使用 Qt 5.5.1 编写。
Qt Quick
Qt Quick 是一项现代化的用户界面技术,它将声明式用户界面设计与命令式编程逻辑分离开来。它是 Qt 框架中的一个应用程序框架。它提供了一种构建自定义、高度动态的用户界面的方法,具有流畅的过渡和效果,这在移动设备中越来越常见。
Qt Quick 是一个独立于 Qt Widgets 的模块,Qt Widgets 主要面向传统的桌面应用程序。Qt Quick 基于 QML 声明式语言。
QML
QML 是一种用户界面规范和编程语言。它允许创建流畅动画和视觉上吸引人的应用程序。QML 提供了一种高度可读的、声明式的、类似 JSON 的语法,支持命令式 JavaScript 表达式,并结合动态属性绑定。
QML 由元素层次结构组成。
简单示例
我们从一个简单的示例开始。
import QtQuick 2.5
import QtQuick.Controls 1.4
ApplicationWindow {
width: 300
height: 200
title: "Simple"
Text {
text: "Qt Quick"
anchors.horizontalCenter: parent.horizontalCenter
anchors.verticalCenter: parent.verticalCenter
font.pointSize: 24; font.bold: true
}
}
代码创建了一个带有居中文本的小窗口。
import QtQuick 2.5 import QtQuick.Controls 1.4
已导入必要的模块。Qt Quick 模块的最新版本与 Qt 版本不同。这些是 Qt 5.5.1 的最新模块。
ApplicationWindow {
...
}
ApplicationWindow 是 Qt Quick 的主应用程序窗口控件。用户界面元素通过它们的类型名称后跟两个花括号指定。
width: 300 height: 200 title: "Simple"
这是 ApplicationWindow 元素的三个内置属性。它们指定窗口的宽度、高度和标题。
Text {
text: "Qt Quick"
anchors.horizontalCenter: parent.horizontalCenter
anchors.verticalCenter: parent.verticalCenter
font.pointSize: 24
}
Text 控件显示文本;文本通过 text 属性指定。它声明在 ApplicationWindow 元素内,该元素是它的父元素。我们通过 parent 属性引用父元素。anchors 用于将 Text 控件居中放置在应用程序窗口内。最后,font 属性用于设置文本的大小。parent 和 font 是组属性的示例。
使用 qmlscene 工具加载 simple.qml 文档后,我们得到这张图片。
退出按钮
在第二个示例中,我们介绍了 Button 控件。
import QtQuick 2.5
import QtQuick.Controls 1.4
ApplicationWindow {
width: 300
height: 200
title: "Quit button"
Button {
x: 20
y: 20
text: "Quit"
onClicked: Qt.quit()
}
}
窗口上放置了一个按钮。点击该按钮将终止应用程序。
Button {
x: 20
y: 20
text: "Quit"
onClicked: Qt.quit()
}
Button 控件嵌套在 ApplicationWindow 元素中。它放置在 x=20, y=20 的坐标处;坐标相对于窗口的左上角。text 属性指定按钮的标签。onClicked 是按钮点击信号的处理程序。Qt.quick 函数终止应用程序。
复选框
CheckBox 是一个 Qt Quick 控件,它有两个状态:开和关。复选框通常用于表示应用程序中可以启用或禁用的功能。
import QtQuick 2.5
import QtQuick.Controls 1.4
ApplicationWindow {
id: rootwin
width: 300
height: 200
title: "CheckBox"
function onChecked(checked) {
if (checked) {
rootwin.title = "CheckBox"
} else {
rootwin.title = " "
}
}
CheckBox {
x: 15
y: 15
text: "Show title"
checked: true
onClicked: rootwin.onChecked(checked)
}
}
在我们的示例中,我们在窗口上放置了一个复选框。复选框显示或隐藏窗口的标题。
id: rootwin
id 是一个特殊值,用于引用 QML 文档内的元素。id 在文档内必须是唯一的,并且不能将其重置为不同的值,也不能对其进行查询。
function onChecked(checked) {
if (checked) {
rootwin.title = "CheckBox"
} else {
rootwin.title = " "
}
}
onChecked 是一个 JavaScript 函数,它设置或删除窗口的标题。为此,我们使用了先前创建的 rootwin id。
CheckBox {
x: 15
y: 15
text: "Show title"
checked: true
onClicked: rootwin.onChecked(checked)
}
由于标题在应用程序启动时可见,我们使用 checked 属性将 CheckBox 设置为选中状态。onClicked 处理程序调用 onChecked 函数。由于它定义在根窗口的空间中,我们再次使用 rootwin id 来引用它。
滑块
Slider 是一个具有简单手柄的控件。可以前后拖动此手柄,从而为特定任务选择一个值。
import QtQuick 2.5
import QtQuick.Controls 1.4
ApplicationWindow {
id: rootwin
width: 300
height: 200
title: "Slider"
Row {
Slider {
id: slider
minimumValue: 0
maximumValue: 100
}
Label {
text: Math.floor(slider.value)
}
}
}
窗口上放置了一个 Slider 和一个 Label 控件。拖动滑块会更新标签。
Row {
...
}
Row 是一个 QML 类型,它沿着单行排列其子项。
Slider {
id: slider
minimumValue: 0
maximumValue: 100
}
创建了一个 Slider 控件。我们指定了它的最小值和最大值。
Label {
text: Math.floor(slider.value)
}
标签的 text 属性绑定到滑块的 value 属性。这称为属性绑定。
NumberAnimation
Qt Quick 中有几种类型的动画。其中之一是 NumberAnimation。NumberAnimation 是用于数值变化的专用属性动画。
import QtQuick 2.5
import QtQuick.Controls 1.4
ApplicationWindow {
width: 400
height: 300
title: "Number animation"
Rectangle {
x: 20
y: 20
width: 100; height: 100
color: "forestgreen"
NumberAnimation on x { to: 250; duration: 1000 }
}
}
在这个示例中,我们使用 NumberAnimation 来为矩形设置动画;矩形沿 x 轴移动,持续一秒钟。
NumberAnimation on x { to: 250; duration: 1000 }
动画应用于 Rectangle 的 x 属性。to: 属性保存动画的结束值。duration: 属性保存动画的持续时间(以毫秒为单位)。
自定义绘图
可以在 Canvas 元素上执行自定义绘图。
import QtQuick 2.5
import QtQuick.Controls 1.4
ApplicationWindow {
width: 400
height: 200
title: "Shapes"
Canvas {
anchors.fill: parent
onPaint: {
var ctx = getContext("2d");
ctx.fillStyle = "lightslategray"
ctx.beginPath();
ctx.fillRect(10, 10, 80, 50);
ctx.beginPath();
ctx.fillRect(120, 10, 70, 70);
ctx.beginPath();
ctx.ellipse(230, 10, 90, 70);
ctx.fill();
ctx.beginPath();
ctx.ellipse(10, 110, 70, 70);
ctx.fill();
ctx.beginPath();
ctx.roundedRect(120, 110, 70, 70, 10, 10);
ctx.fill();
ctx.beginPath();
ctx.moveTo(230, 110);
ctx.arc(230, 110, 70, 0, Math.PI * 0.5, false);
ctx.fill();
}
}
}
在示例中,我们在画布上绘制了六种不同的形状:一个矩形、一个正方形、一个椭圆、一个圆形、一个圆角矩形和一个弧形。
Canvas {
anchors.fill: parent
...
}
Canvas 填充整个父容器。
var ctx = getContext("2d");
我们使用 getContext 函数获取绘图上下文。
ctx.fillStyle = "lightslategray"
形状的内部填充为浅豆灰色。
ctx.beginPath(); ctx.fillRect(10, 10, 80, 50);
beginPath 函数开始一个新路径。fillRect 使用 fillStyle 绘制指定的矩形区域。
在 C++ 中部署 Qt Quick 应用程序
在本节中,我们将展示如何在 C++ 中部署 Qt Quick 应用程序。
QT += qml quick TARGET = Simple TEMPLATE = app SOURCES += main.cpp
这是项目文件。它将 qml 和 quick 模块包含到应用程序中。
import QtQuick 2.5
import QtQuick.Controls 1.4
ApplicationWindow {
width: 300
height: 200
title: "Simple"
Text {
text: "Qt Quick"
anchors.horizontalCenter: parent.horizontalCenter
anchors.verticalCenter: parent.verticalCenter
font.pointSize: 24
}
}
这是将在 C++ 应用程序中显示的 QML 文档;它包含一个居中文本。
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQuickWindow>
int main(int argc, char *argv[]) {
QGuiApplication app(argc, argv);
QQmlApplicationEngine engine;
engine.load(QUrl("simple.qml"));
QObject *topLevel = engine.rootObjects().value(0);
QQuickWindow *window = qobject_cast<QQuickWindow *>(topLevel);
window->show();
return app.exec();
}
QQmlApplicationEngine 用于加载 QML 文档。
在 PyQt5 中部署 Qt Quick 应用程序
在本节中,我们将展示如何在 PyQt5 中部署 Qt Quick 应用程序。
$ sudo apt-get install python3-pyqt5 $ sudo apt-get install python3-pyqt5.qtquick $ sudo apt-get install qtdeclarative5-qtquick2-plugin
在基于 Debian 的 Linux 系统上,我们可以安装上述软件包来开始。
import QtQuick 2.2
Rectangle {
x: 20
y: 20
width: 100
height: 100
color: "lightsteelblue"
}
这是将在 PyQt5 应用程序中显示的 QML 文档;它包含一个矩形对象。
#!/usr/bin/python3
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow
from PyQt5.QtCore import QUrl
from PyQt5.QtQuick import QQuickView
if __name__ == "__main__":
app = QApplication(sys.argv)
view = QQuickView()
view.setSource(QUrl('basic.qml'))
view.show()
sys.exit(app.exec_())
QQuickView 类提供了一个用于显示 Qt Quick 用户界面的窗口。