自 QML 第一次发布已经过去一年多的时间,但在企业应用领域,QML 一直没有能够占据一定地位。很大一部分原因是,QML 缺少一些在企业应用中亟需的组件,比如按钮、菜单等。虽然移动领域,这些组件已经变得可有可无,但在桌面系统中依然不可或缺。为了解决这一问题,Qt 5.1 发布了 Qt Quick 的一个全新模块:Qt Quick Controls。顾名思义,这个模块提供了大量类似 Qt Widgets 模块那样可重用的组件。本章我们将介绍 Qt Quick Controls,你会发现这个模块与 Qt 组件非常类似。

为了开发基于 Qt Quick Controls 的程序,我们需要创建一个 Qt Quick Application 类型的应用程序,选择组件集的时候注意选择 Qt Quick Controls 即可:

注意,Qt Creator 给出的是 Qt Quick Controls 1.0,而最新版本的 Qt 5.2 搭载的 Qt Quick Controls 是 1.1。1.1 比 1.0 新增加了一些组件,比如BusyIndicator等。所以,如果你发现某个组件找不到,记得更新下 Qt Quick Controls 的版本。

Qt Quick Controls 1.1 提供了多种组件:

应用程序窗口,用于描述应用程序基本窗口的组件属性

ApplicationWindow 对应QMainWindow,提供顶层应用程序窗口
MenuBar 对应QMenuBar,提供窗口顶部横向的菜单栏
StatusBar 对应QStatusBar,提供状态栏
ToolBar 对应QToolBar,提供工具栏,可以添加ToolButton和其它组件
Action 对应QAction,提供能够绑定到导航和视图的抽象的用户界面动作
导航和视图
ScrollView 对应QScrollView,提供滚动视图
SplitView 对应QSplitter,提供可拖动的分割视图布局
StackView 对应QStackedWidget,提供基于栈的层叠布局
TabView 对应QTabWidget,提供带有标签的基于栈的层叠布局
TableView 对应QTableWidget,提供带有滚动条、样式和表头的表格
控件
BusyIndicator 提供忙等示意组件
Button 对应QPushButton,提供按钮组件
CheckBox 对应QCheckBox,提供复选框
ComboBox 对应QComboBox,提供下拉框
GroupBox 对应QGroupBox,提供带有标题、边框的容器
Label 对应QLabel,提供标签组件
ProgressBar 对应QProgressBar,提供进度条组件
RadioButton 对应QRadioButton,提供单选按钮
Slider 对应QSlider,提供滑动组件
SpinBox 对应QSpinBox,提供微调组件
Switch 提供类似单选按钮的开关组件
TextArea 对应QTextEdit,提供能够显示多行文本的富文本编辑框
TextField 对应QTextLine,提供显示单行文本的纯文本编辑框
ToolButton
对应QToolButton,提供在工具栏上显示的工具按钮
ExclusiveGroup 提供互斥
菜单
Menu 对应QMenu,提供菜单、子菜单、弹出菜单等
MenuSeparator 提供菜单分隔符
MenuItem 提供添加到菜单栏或菜单的菜单项
StatusBar 对应QStatusBar,提供状态栏
ToolBar 对应QToolBar,提供工具栏,可以添加ToolButton和其它组件

整个程序都是在 IDE 帮我们生成的 main.qml 中实现的。首先我们需要添加import语句:

import QtQuick 2.1
import QtQuick.Controls 1.1

注意我们修改了 IDE 生成的默认语句。整个 QML 文档的根元素是ApplicationWindow

ApplicationWindow {title: qsTr("Simple Editor")width: 640height: 480...
}

ApplicationWindow是应用程序的主窗口,类似QMainWindow,提供了很多预定义的功能,比如菜单、工具栏等。代码里面的qsTr()函数类似tr()函数,用于以后的国际化。所有面向用户的文本都应该使用这个函数。

下面向ApplicationWindow中添加控件:

menuBar: MenuBar {Menu {title: qsTr("&File")MenuItem { action: newAction }MenuItem { action: exitAction }}Menu {title: qsTr("&Edit")MenuItem { action: cutAction }MenuItem { action: copyAction }MenuItem { action: pasteAction }MenuSeparator {}MenuItem { action: selectAllAction }}
}toolBar: ToolBar {Row {anchors.fill: parentToolButton { action: newAction }ToolButton { action: cutAction }ToolButton { action: copyAction }ToolButton { action: pasteAction }}
}TextArea {id: textAreaanchors.fill: parent
}

首先看最后面的TextArea,这是整个窗口的主要控件,类似于setCentralWidget()函数调用。

menuBartoolBar两个属性都是ApplicationWindow提供的属性。

menuBarMenuBar类型的,所以我们创建一个新的MenuBar控件。MenuBar具有层次结构,这是通过Menu的嵌套实现的。每一个菜单项都是用MenuItem实现的;菜单项之间的分隔符则使用MenuSeparator控件。这点与 QtWidgets 有所不同。

toolBarItem类型的,不过通常都会使用ToolBar控件。ToolBar默认没有提供布局,因此我们必须给它设置一个布局。这里我们直接添加了一个Row,作为横向工具栏的布局。这个工具栏要横向充满父窗口,因此设置锚点为anchors.fill: parent。虽然我们设置的是充满整个父窗口,但是工具栏的行为是,如果其中只有一个子元素(比如这里的Row),那么工具栏的高度将被设置为这个子元素的implicitHeight属性。这对结合布局使用非常有用。事实上,这也是工具栏最常用的方法。工具栏中添加了四个按钮,都是ToolButton类型。

每一个MenuItemToolButton都添加了一个action属性。下面是这部分代码:

Action {id: exitActiontext: qsTr("E&xit")onTriggered: Qt.quit()}Action {id: newActiontext: qsTr("New")iconSource: "images/new.png"//默认可执行文件的同级莫目录onTriggered: {textArea.text = "";}}Action {id: cutActiontext: qsTr("Cut")iconSource: "images/cut.png"onTriggered: textArea.cut()//信号处理函数}Action {id: copyActiontext: qsTr("Copy")iconSource: "images/copy.png"onTriggered: textArea.copy()}Action {id: pasteActiontext: qsTr("Paste")iconSource: "images/paste.png"onTriggered: textArea.paste()}Action {id: selectAllActiontext: qsTr("Select All")onTriggered: textArea.selectAll()}

Action类似QAction。这里我们还是使用qsTr()函数设置其显示的文本。

使用iconSource属性可以指定图标。注意这里的图标只能是位于文件系统中的,不能加载资源文件中的图标(当然,这并不是绝对的。如果我们将整个 QML 文档放在资源文件中,那么就可以直接加载资源文件中的图标。我们会在后面的章节详细介绍这种技术。)。当我们直接类似“images/new.png”这种路径时,注意 QML 是运行时解释的,因此这个路径是相对与 QML 文件的路径。所以这里的图标需要放在与 main.qml 文件同目录下的 images 目录中。

onTriggered属性是一种信号处理函数,后面可以添加 JavaScript 语句。如果是多条语句,可以使用大括号,例如newActiononTriggered。QML 组件可以发出信号。与 C++ 不同的是,QML 组件的信号并不需要特别的连接语句,而是使用”on信号名字”的形式。比如,Action有一个名为triggered的信号,则其信号处理函数即为onTriggered。事实上,这是最简单的一种信号槽的实现。不过,这种实现的困难在于,同一个信号只能有一个固定名字的信号处理函数。不过,我们也可以使用 connect 连接语句。后面的章节中将详细介绍这一点。

至此,我们的编辑器便实现了。由于全部使用了TextArea提供的功能,所以代码很简单。不过,复杂的程序都是这些简单的元素堆积而成,所以,我们现在只是简单介绍,具体的控件使用还要根据文档仔细研究。

源代码路径,点击这里

Qt Quick Controls相关推荐

  1. 10.QML Qt Quick Controls 2之imagine style

    Qt Quick Controls 2的目标之一是将控件的逻辑与外观分离.外观的实现由QML代码和图形资源组成.使用Imagine样式(imagine style),可以自定义应用程序的外观和图形资源 ...

  2. 7.QML Qt Quick——基于Qt Quick Controls 2实现图片浏览器

    Qt Quick Controls 2提供了一组UI控件,例如按钮,标签,复选框,滑块等(用之查之即可).用于在Qt Quick中创建用户界面.UI控件很多,这里通过一个图片浏览器的实现来逐步讲解 图 ...

  3. qml自定义switch_QML官方系列教程——Qt Quick Controls Styles

    附网址:http://qt-project.org/doc/qt-5/qtquickcontrolsstyles-index.html Qt Quick Controls Styles -- Qt Q ...

  4. Qt文档阅读笔记-Qt Quick Controls - Wearable Demo实例解析

    程序运行截图如下: 这个实例主要是用qml玩界面. main.qml文件以及wearable.qml分别是由ApplicationWindow和StatckView.这个StackView用于做导航相 ...

  5. qml 时间控件_Qt6官方最新消息:桌面样式Qt quick Controls 2支持大多控件,委托更少,运行更流畅...

    Qt是一个跨平台框架,通常用作图形工具包,它不仅创建CLI应用程序中非常有用.而且它也可以在三种主要的台式机操作系统以及移动操作系统(如Symbian,Nokia Belle,Meego Harmat ...

  6. 《Qt5 Cadaques》学习笔记(六):QT QUICK Controls 2

    6.1 控件简介 从头开始使用 Qt Quick 为您提供了基本的图形和交互元素,您可以从中构建用户界面.使用 Qt Quick Controls 2,您可以从一组稍微结构化的控件开始构建.控件范围从 ...

  7. Qt Quick Controls 配置文件

    Qt Quick Controls 配置文件 Qt Quick Controls支持一个特殊的配置文件 qtquickcontrols2.conf,该文件内置于应用程序的资源中. 配置文件可以指定首选 ...

  8. Hello Qt(五十一)———Qt Quick Controls

    一.Qt Quick Controls基础 QT5.1发布了Qt Quick的一个全新模块:Qt Quick Controls.Qt Quick Controls模块提供了大量类似Qt Widgets ...

  9. 自定义 Qt Quick Controls

    自定义 Qt Quick Controls 使用 Qt Quick 编写界面时,使用 Qt Quick Controls(指Qt Quick Controls 2)模块中提供的大量控件,可以快速开发出 ...

  10. Qt6官方最新消息:桌面样式Qt quick Controls 2支持大多控件,委托更少,运行更流畅

    Qt是一个跨平台框架,通常用作图形工具包,它不仅创建CLI应用程序中非常有用.而且它也可以在三种主要的台式机操作系统以及移动操作系统(如Symbian,Nokia Belle,Meego Harmat ...

最新文章

  1. socket的阻塞非阻塞方法在缓冲区的差别
  2. vue修改计算属性的值_八.Vue计算属性
  3. linux 守护进程_Linux 守护进程
  4. android WebView的简单使用
  5. java线程提交_从Java线程到线程池
  6. linux创建sudo用户_Linux终极指南-创建Sudo用户
  7. 程序员成长的10个阶段
  8. Objective-C中变量采用@property的各个属性值的含义
  9. 删除域中不再存在的主机
  10. 再次提升“华容道自动求解”程序效率
  11. Linux系统基本操作(二)—设置本地光盘为yum源
  12. gtk_widget_add_events为某个构件添加一个事件
  13. Delphi7中默认没有安装的官方控件
  14. EXCEL中拟合公式的问题
  15. Linux脚本定时开关机,2020-09-06shell脚本开机自动启动与定时任务
  16. Unity 灯光设置——灯光类型
  17. [2008-12-12]希捷桌面、笔记本硬盘质保期缩短至3年
  18. OpenCV求(图像)矩阵中最大值,最小值函数minMaxLoc() vs minMaxIdx()
  19. int / long / long int / long long / long long int
  20. 一款QQ盗号木马分析

热门文章

  1. Win 10系统规避驱动数字签名
  2. Paxos 实现日志复制同步(Basic Paxos)
  3. Spark、Hadoop大数据平台搭建
  4. mysql 32位_MySQL8下载 MySQL 8 for windows 32位 v8.0.18 官方免费正式版 下载-脚本之家
  5. eclipse安装超帅主题----darkest dark
  6. 服务器cpu天梯图_笔记本CPU排行天梯图2020
  7. VS2010编程助手
  8. 优麒麟安装qq (Ubuntu)
  9. linux一键安装lamp教程,CentOS7下LAMP一键安装包教程
  10. 等值线/面生成一站式封装