原文: http://zetcode.com/gui/qtquick/

这是 Qt Quick 入门教程。 本教程讲授了 Qt Quick 中编程的基础知识。 本教程使用 Qt 5.5.1 编写。

Qt Quick

Qt Quick 是一种现代的用户界面技术,将声明性用户界面设计和命令性编程逻辑分开。 它是 Qt 框架内的一个应用框架。 它提供了一种构建自定义的,高度动态的,具有流畅过渡和效果的用户界面的方式,这种方式在移动设备中尤为常见。

Qt Quick 是与 Qt Widgets 分离的模块,该模块针对传统的桌面应用。 Qt Quick 基于 QML 声明性语言。

QML

QML 是一种用户界面规范和编程语言。 它允许创建流畅的动画和视觉吸引力的应用。 QML 提供了一种高度可读的,声明性的,类似于 JSON 的语法,并支持将命令性 JavaScript 表达式与动态属性绑定结合在一起。

QML 由元素层次构成。

简单的例子

我们从一个简单的例子开始。

simple.qml

  1. import QtQuick 2.5
  2. import QtQuick.Controls 1.4
  3. ApplicationWindow {
  4. width: 300
  5. height: 200
  6. title: "Simple"
  7. Text {
  8. text: "Qt Quick"
  9. anchors.horizontalCenter: parent.horizontalCenter
  10. anchors.verticalCenter: parent.verticalCenter
  11. font.pointSize: 24; font.bold: true
  12. }
  13. }

该代码创建一个带有居中文本的小窗口。

  1. import QtQuick 2.5
  2. import QtQuick.Controls 1.4

导入了必要的模块。 Qt Quick 模块的最新版本与 Qt 版本不同。 这些是 Qt 5.5.1 的最新模块。

  1. ApplicationWindow {
  2. ...
  3. }

ApplicationWindow是用于主应用窗口的 Qt Quick 控件。 用户界面元素由其类型名称指定,后跟两个大括号。

  1. width: 300
  2. height: 200
  3. title: "Simple"

这是ApplicationWindow元素的三个内置属性。 它们指定窗口的宽度,高度和标题。

  1. Text {
  2. text: "Qt Quick"
  3. anchors.horizontalCenter: parent.horizontalCenter
  4. anchors.verticalCenter: parent.verticalCenter
  5. font.pointSize: 24
  6. }

Text控件显示文本; 文本是使用text属性指定的。 在其父元素ApplicationWindow元素中声明它。 我们通过parent属性引用父对象。 anchors用于在应用窗口中将Text控件居中。 最后,font属性用于设置文本的大小。 parentfont是组属性的示例。

Qt Quick 教程 - 图1

图:简单 example

qmlscene工具加载simple.qml文档后,我们得到了这张图片。

退出按钮

在第二个示例中,我们展示Button控件。

quit_button.qml

  1. import QtQuick 2.5
  2. import QtQuick.Controls 1.4
  3. ApplicationWindow {
  4. width: 300
  5. height: 200
  6. title: "Quit button"
  7. Button {
  8. x: 20
  9. y: 20
  10. text: "Quit"
  11. onClicked: Qt.quit()
  12. }
  13. }

窗口上放置了一个按钮。 单击该按钮可终止该应用。

  1. Button {
  2. x: 20
  3. y: 20
  4. text: "Quit"
  5. onClicked: Qt.quit()
  6. }

Button控件嵌套在ApplicationWindow元素内。 它放置在x = 20y = 20坐标处; 坐标相对于窗口的左上角。 text属性指定按钮的标签。 onClicked()是按钮单击信号的处理器。 Qt.quick()函数终止应用。

Qt Quick 教程 - 图2

图:退出按钮

CheckBox

CheckBox是 Qt Quick 控件,具有两种状态:开和关。 复选框通常用于表示可以启用或禁用的应用中的功能。

mycheckbox.qml

  1. import QtQuick 2.5
  2. import QtQuick.Controls 1.4
  3. ApplicationWindow {
  4. id: rootwin
  5. width: 300
  6. height: 200
  7. title: "CheckBox"
  8. function onChecked(checked) {
  9. if (checked) {
  10. rootwin.title = "CheckBox"
  11. } else {
  12. rootwin.title = " "
  13. }
  14. }
  15. CheckBox {
  16. x: 15
  17. y: 15
  18. text: "Show title"
  19. checked: true
  20. onClicked: rootwin.onChecked(checked)
  21. }
  22. }

在我们的示例中,我们在窗口上放置了一个检查按钮。 复选按钮显示或隐藏窗口的标题。

  1. id: rootwin

id是一个特殊值,用于引用 QML 文档中的元素。 id 在文档中必须唯一,并且不能将其重置为其他值,也无法查询。

  1. function onChecked(checked) {
  2. if (checked) {
  3. rootwin.title = "CheckBox"
  4. } else {
  5. rootwin.title = " "
  6. }
  7. }

onChecked是一个 JavaScript 函数,用于设置或删除窗口的标题。 为此,我们使用先前创建的rootwin ID。

  1. CheckBox {
  2. x: 15
  3. y: 15
  4. text: "Show title"
  5. checked: true
  6. onClicked: rootwin.onChecked(checked)
  7. }

由于标题在应用的开头是可见的,因此我们使用checked属性将CheckBox设置为选中状态。 onClicked处理器调用onChecked函数。 由于它是在根窗口的空间中定义的,因此我们再次使用rootwin id 来引用它。

Qt Quick 教程 - 图3

图:CheckBox

滑杆

Slider是具有简单句柄的控件。 可以前后拉动此手柄,从而为特定任务选择一个值。

slider.qml

  1. import QtQuick 2.5
  2. import QtQuick.Controls 1.4
  3. ApplicationWindow {
  4. id: rootwin
  5. width: 300
  6. height: 200
  7. title: "Slider"
  8. Row {
  9. Slider {
  10. id: slider
  11. minimumValue: 0
  12. maximumValue: 100
  13. }
  14. Label {
  15. text: Math.floor(slider.value)
  16. }
  17. }
  18. }

窗口上放置了SliderLabel控件。 拉动滑块,我们将更新标签。

  1. Row {
  2. ...
  3. }

Row是 QML 类型,其子项沿一行放置。

  1. Slider {
  2. id: slider
  3. minimumValue: 0
  4. maximumValue: 100
  5. }

创建一个Slider控件。 我们指定其最小值和最大值。

  1. Label {
  2. text: Math.floor(slider.value)
  3. }

标签的text属性绑定到滑块的value属性。 这称为属性绑定。

Qt Quick 教程 - 图4

图:滑块

NumberAnimation

Qt Quick 中提供了几种动画类型。 其中之一是NumberAnimationNumberAnimation是数值变化的特殊属性动画。

numberanim.qml

  1. import QtQuick 2.5
  2. import QtQuick.Controls 1.4
  3. ApplicationWindow {
  4. width: 400
  5. height: 300
  6. title: "Number animation"
  7. Rectangle {
  8. x: 20
  9. y: 20
  10. width: 100; height: 100
  11. color: "forestgreen"
  12. NumberAnimation on x { to: 250; duration: 1000 }
  13. }
  14. }

在示例中,我们使用NumberAnimation为矩形设置动画; 矩形沿 x 轴移动一秒钟。

  1. NumberAnimation on x { to: 250; duration: 1000 }

动画将应用于Rectanglex属性。 to:属性保存动画的结束值。 duration:属性保存动画的持续时间(以毫秒为单位)。

自定义绘图

可以在Canvas元素上执行自定义绘图。

shapes.qml

  1. import QtQuick 2.5
  2. import QtQuick.Controls 1.4
  3. ApplicationWindow {
  4. width: 400
  5. height: 200
  6. title: "Shapes"
  7. Canvas {
  8. anchors.fill: parent
  9. onPaint: {
  10. var ctx = getContext("2d");
  11. ctx.fillStyle = "lightslategray"
  12. ctx.beginPath();
  13. ctx.fillRect(10, 10, 80, 50);
  14. ctx.beginPath();
  15. ctx.fillRect(120, 10, 70, 70);
  16. ctx.beginPath();
  17. ctx.ellipse(230, 10, 90, 70);
  18. ctx.fill();
  19. ctx.beginPath();
  20. ctx.ellipse(10, 110, 70, 70);
  21. ctx.fill();
  22. ctx.beginPath();
  23. ctx.roundedRect(120, 110, 70, 70, 10, 10);
  24. ctx.fill();
  25. ctx.beginPath();
  26. ctx.moveTo(230, 110);
  27. ctx.arc(230, 110, 70, 0, Math.PI * 0.5, false);
  28. ctx.fill();
  29. }
  30. }
  31. }

在示例中,我们在画布上绘制了六个不同的形状:矩形,正方形,椭圆形,圆形,圆角矩形和弧形。

  1. Canvas {
  2. anchors.fill: parent
  3. ...
  4. }

Canvas填充整个父级。

  1. var ctx = getContext("2d");

我们使用getContext()函数获得绘图上下文。

  1. ctx.fillStyle = "lightslategray"

形状的内部充满了光亮的色彩。

  1. ctx.beginPath();
  2. ctx.fillRect(10, 10, 80, 50);

beginPath()函数开始一个新路径。 fillRect()使用fillStyle绘制指定的矩形区域。

Qt Quick 教程 - 图5

图:形状

在 C++ 中部署 Qt Quick 应用

在本节中,我们显示如何在 C++ 中部署 Qt Quick 应用。

simple.pro

  1. QT += qml quick
  2. TARGET = Simple
  3. TEMPLATE = app
  4. SOURCES += main.cpp

这是项目文件。 它在应用中包括 qml 和 quick 模块。

basic.qml

  1. import QtQuick 2.5
  2. import QtQuick.Controls 1.4
  3. ApplicationWindow {
  4. width: 300
  5. height: 200
  6. title: "Simple"
  7. Text {
  8. text: "Qt Quick"
  9. anchors.horizontalCenter: parent.horizontalCenter
  10. anchors.verticalCenter: parent.verticalCenter
  11. font.pointSize: 24
  12. }
  13. }

这是要在 C++ 应用中显示的 QML 文档。 它包含居中文本。

main.cpp

  1. #include <QGuiApplication>
  2. #include <QQmlApplicationEngine>
  3. #include <QQuickWindow>
  4. int main(int argc, char *argv[]) {
  5. QGuiApplication app(argc, argv);
  6. QQmlApplicationEngine engine;
  7. engine.load(QUrl("simple.qml"));
  8. QObject *topLevel = engine.rootObjects().value(0);
  9. QQuickWindow *window = qobject_cast<QQuickWindow *>(topLevel);
  10. window->show();
  11. return app.exec();
  12. }

QQmlApplicationEngine用于加载 QML 文档。

在 PyQt5 中部署 Qt Quick 应用

在本节中,我们显示如何在 PyQt5 中部署 Qt Quick 应用。

  1. $ sudo apt-get install python3-pyqt5
  2. $ sudo apt-get install python3-pyqt5.qtquick
  3. $ sudo apt-get install qtdeclarative5-qtquick2-plugin

在基于 Debian 的 Linux 上,我们可以安装上述包以使事情顺利进行。

basic.qml

  1. import QtQuick 2.2
  2. Rectangle {
  3. x: 20
  4. y: 20
  5. width: 100
  6. height: 100
  7. color: "lightsteelblue"
  8. }

这是要在 PyQt5 应用中显示的 QML 文档; 它包含一个矩形对象。

launcher.py

  1. #!/usr/bin/python3
  2. # -*- coding: utf-8 -*-
  3. import sys
  4. from PyQt5.QtWidgets import QApplication, QMainWindow
  5. from PyQt5.QtCore import QUrl
  6. from PyQt5.QtQuick import QQuickView
  7. if __name__ == "__main__":
  8. app = QApplication(sys.argv)
  9. view = QQuickView()
  10. view.setSource(QUrl('basic.qml'))
  11. view.show()
  12. sys.exit(app.exec_())

QQuickView类提供了一个用于显示 Qt Quick 用户界面的窗口。

Tweet

这是 QtQuick 教程。 您可能也对 Qt5 教程PyQt5 教程感兴趣。