简介  

  Component是Qt封装好的、只暴露必要接口的QML类型,可以重复利用。一个QML组件就像一个黑盒子,它通过属性、信号、函数和外部世界交互。

  一个Component既可以定义在独立的QML文件(.qml为后缀的文件)中,也可以嵌入到其他的QML文件中来定义。那么这两种方式分别适用于什么场景呢?这里有一个原则可以帮助我们去选择Component的定义方式:如果一个Component比较小且只在某个QML文件中使用,或者说一个Component从逻辑上来看属于某个QML文档,那么就可以采用嵌入的方式来定义该Component;如果这个Component有很多地方可以用到,也就是说复用率比较高,那么就可以采用定义在独立的QML文件中的方式。下面说明一下这两种实现Component方式的差别:

  • 嵌入式定义Component:

  要在一个QML文件中嵌入Component的定义,需要使用Component对象。

  定义一个Component与定义一个QML文件类似,Component只能包含一个顶层Item,而且在这个Item之外不能定义任何数据,除了id。 在顶层Item之内,则可以包含更多的子元素来协同工作,最终形成一个具有特定功能的组件。

  Component通常用来给一个View提供图形化组件,比如ListVIew::delegate属性就需要一个Component来指定如何显示列表的每一个项,又比如ButtonStyle::background属性也需要一个Component来指定如何绘制Button的背景。  

  Component不是Item的派生类,而是从QQmlComponent继承而来的,虽然它通过自己的顶层Item为其他的view提供可视化组件,但它本身是不可见元素。你可以这么理解:你定义的组件是一个新的类型,他必须被实例化以后才能显示。而要实例化一个嵌入在QML文件中定义的Component,则可以通过Loader。

  • 在单独文件中定义Component:

  很多时候我们把一个Component单独定义在一个QML文件中,比如Qt Qucik提供的BusyIndicator空间,其实就是在BusyIndicator中定义一个组件(BusyIndicator.qml):

Control {
id: indicator /*! \qmlproperty bool BusyIndicator::running This property holds whether the busy indicator is currently indicating
activity. \note The indicator is only visible when this property is set to \c true. The default value is \c true.
*/
property bool running: true Accessible.role: Accessible.Indicator
Accessible.name: "busy" style: Settings.styleComponent(Settings.style, "BusyIndicatorStyle.qml", indicator)
}

  可以看到BusyIndicator的代码非常简单,只是给Control元素(Qt Quick定义的私有元素,用作其他控件的基类,如ComboBox、BusyIndicator等)增加了一个属性,设置了几个值而已。

  BusyIndicator.qml文件中的顶层Item是Control,而我们使用时却是以BusyIndicator为组件名(类名)。这是定义Component的一个约定:组件名必须和QML文件名一致,且组件名的首字母必须是大写的。Qt Quick提供的多数基本元素和特性,都可以在定义组件时使用 。

  例子:在一个单独的QMl文件中定义颜色选择组件ColorPicker,对应QML文件为ColorPicker.qml,可以在其他的QMl文件中使用Cololr{...}来创建ColorPicker的实例。

import QtQuick 2.6

Rectangle {
id: colorPicker
width: 50
height: 30
signal colorPicked(color clr); function configureBorder() {
colorPicker.border.width = colorPicker.focus ? 2 : 0;
colorPicker.border.color = colorPicker.focus ? "#90D750" : "#808080";
} MouseArea {
anchors.fill: parent
onClicked: {
colorPicker.colorPicked(colorPicker.color);
mouse.accepted = true;
colorPicker.focus = true;
}
} Keys.onReturnPressed: { // 对应Enter键
console.log("ColorPicker:onReturnPressed");
colorPicker.colorPicked(colorPicker.color);
event.accepted = true;
} Keys.onSpacePressed: { // 对应Space键
console.log("ColorPicker:onSpacePressed");
colorPicker.colorPicked(colorPicker.color);
event.accepted = true;
} onFocusChanged: {
console.log("ColorPicker:onFocusChanged");
configureBorder();
} Component.onCompleted: {
console.log("ColorPicker:onCompleted");
configureBorder();
}
}

  在单独文件中定义Component,与嵌入式定义有明显的不同:Component对象不见了,是因为在单独文件中定义组件,不需要Component对象,只有在其他QML文件中嵌入式定义组件时才需要Component对象。

  main.qml内容:

import QtQuick 2.6
import QtQuick.Window 2.2
import QtQuick.Controls 1.4 Window {
visible: true
width: 320
height: 240
title: qsTr("Component") Rectangle {
width: parent.width
height: parent.height
color: "#EEEEEE" Text {
id: coloredText
anchors.centerIn: parent
anchors.top: parent.top
anchors.topMargin: 4
text: "ColorPicker"
font.pixelSize: 32
} function setTextColor(clr) {
coloredText.color = clr;
} ColorPicker {
id: redColor
color: "red"
focus: true
width: parent.width / 3 - 4
anchors.left: parent.left
anchors.leftMargin: 4
anchors.bottom: parent.bottom
anchors.bottomMargin: 4 KeyNavigation.right: blueColor
KeyNavigation.tab: blueColor
onColorPicked: {
coloredText.color = clr;
}
} ColorPicker {
id: blueColor
color: "blue"
width: parent.width / 3 - 4
anchors.left: redColor.right
anchors.leftMargin: 4
anchors.bottom: parent.bottom
anchors.bottomMargin: 4 KeyNavigation.left: redColor
KeyNavigation.right: pinkColor
KeyNavigation.tab: pinkColor
} ColorPicker {
id: pinkColor
color: "pink"
width: parent.width / 3 - 8
anchors.left: blueColor.right
anchors.leftMargin: 4
anchors.bottom: parent.bottom
anchors.bottomMargin: 4 KeyNavigation.left: blueColor
KeyNavigation.tab: redColor
} Component.onCompleted: {
blueColor.colorPicked.connect(setTextColor);
pinkColor.colorPicked.connect(setTextColor);
}
}
}

《Qt Quick核心编程》

Qt QML Component 学习笔记的更多相关文章

  1. (转)Qt Model/View 学习笔记 (七)——Delegate类

    Qt Model/View 学习笔记 (七) Delegate  类 概念 与MVC模式不同,model/view结构没有用于与用户交互的完全独立的组件.一般来讲, view负责把数据展示 给用户,也 ...

  2. (转)Qt Model/View 学习笔记 (五)——View 类

    Qt Model/View 学习笔记 (五) View 类 概念 在model/view架构中,view从model中获得数据项然后显示给用户.数据显示的方式不必与model提供的表示方式相同,可以与 ...

  3. 【Qt官方例程学习笔记】Application Example(构成界面/QAction/退出时询问保存/用户偏好载入和保存/文本文件的载入和保存/QCommandLineParser解析运行参数)

    The Application example shows how to implement a standard GUI application with menus, toolbars, and ...

  4. 【Qt官方例程学习笔记】Raster Window Example(画笔的平移/旋转/缩放应用)

    这个例子显示了如何使用QPainter渲染一个简单的QWindow. 值得学习的内容 <QtGui>头文件 #include <QtGui>就可以使用Qt GUI模块中的所有类 ...

  5. 【Qt官方例程学习笔记】Analog Clock Window Example (画笔的平移/旋转/缩放应用)

    这个例子演示了如何使用QPainter的转换和缩放特性来简化绘图. 值得学习的: 定时器事件ID检查: 在定时器事件中检查定时器id是比较好的实践. QPainter抗锯齿: We call QPai ...

  6. (转)Qt Model/View 学习笔记 (四)——创建新的Models

    创建新的Models 介绍 model/view组件之间功能的分离,允许创建model利用现成的views.这也可以使用标准的功能 图形用户接口组件像QListView,QTableView和QTre ...

  7. (转)Qt Model/View 学习笔记 (三)——Model类

    Model类 基本概念 在model/view构架中,model为view和delegates使用数据提供了标准接口.在Qt中,标准接口QAbstractItemModel类中被定义.不管数据在底层以 ...

  8. (转)Qt Model/View 学习笔记 (二)——Qt Model/View模式举例

    Qt Model/View模式举例 Qt提供了两个标准的models:QStandardItemModel和QDirModel.QStandardItemModel是一个多用途的model,可用于表示 ...

  9. (转)Qt Model/View 学习笔记 (一)——Qt Model/View模式简介

    Qt Model/View模式简介 Qt 4推出了一组新的item view类,它们使用model/view结构来管理数据与表示层的关系.这种结构带来的 功能上的分离给了开发人员更大的弹性来定制数据项 ...

随机推荐

  1. SQL Server 2008创建数据库

    1.数据.数据库.数据管理系统基本概念: 数据:人类有用信息的符号化表示. 数据库:按照数据结构来组织.存储和管理数据的一个仓库. 数据库管理系统(DBMS):可维护.存储并为应用系统提供数据的软件系 ...

  2. 从bbs.3dmgame.com与qq的登录解析oauth2.0协议

    点击3dm上的qq图标,浏览器跳转到,地址为: https://graph.qq.com/oauth2.0/show ?which=Login &display=pc &respons ...

  3. 银行业务队列简单模拟(队列queue)

    设某银行有A.B两个业务窗口,且处理业务的速度不一样,其中A窗口处理速度是B窗口的2倍 —— 即当A窗口每处理完2个顾客时,B窗口处理完1个顾客.给定到达银行的顾客序列,请按业务完成的顺序输出顾客序列 ...

  4. 解决修改JDK环境变量不生效方法

    解决修改JDK环境变量不生效方法 brupsuit1.7在安装时一直报错jdk版本低,我就将jdk1.6版本的卸了换成1.8的,结果修改了环境变量但它一直给我不生效.... 1.之前版本未卸载干净 进 ...

  5. AcWing 802. 区间和 离散化

    https://www.acwing.com/problem/content/804/ #include <iostream> #include <vector> #inclu ...

  6. [Reversal 剧情设计] 第一章——不速之客

    夜.草叶上渗出的晶莹水珠反射着清冷的月光,但随后就暗淡下来——一个身披黑色大衣的男人无声地经过,腰间的长剑隐约露出剑柄. 远处是一个静谧的小山村,少有外人来往,此时正值深夜,家家户户都熄灭了油灯,只有 ...

  7. 题解【洛谷P1514】[NOIP2010]引水入城

    题目描述 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个 \(N\) 行 \(M\) 列的矩形,如上图所示,其中每个格子都代表一座城市,每座城市 ...

  8. 并发之ATOMIC原子操作--CAS乐观锁原理(二)

    1.乐观锁介绍 程序完成并发操作时,访问数据时每次不加锁,假设没有冲突去完成某项操作,如果因为冲突失败就重试,直到成功为止.就是当去做某个修改或其他操作的时候它认为不会有其他线程来做同样的操作(竞争) ...

  9. 浅谈Power Signoff

    Power Analysis是芯片设计实现中极重要的一环,因为它直接关系到芯片的性能和可靠性.Power Analysis 需要Timing Analysis 产生包含频率.transition 等时 ...

  10. codeforces div2 603 D. Secret Passwords(并查集)

    题目链接:https://codeforces.com/contest/1263/problem/D 题意:有n个小写字符串代表n个密码,加入存在两个密码有共同的字母,那么说这两个密码可以认为是同一个 ...