一、理解qml模型和视图

qt的发展是迅速的,虽然在每一个release版本中或多或少都有bug,但是作为一个庞大的gui库,no,应该说是一个开发框架开说,qt已经算是做的相当好。qml部分是qt4.7的时候推出的,当时qml只是为了移动端而设计的开发语言,随着it行业的发展,桌面端也产生了一定的需求,这就使得qml也必须支持桌面端的开发。使用qml可以做出绚丽的界面,并把逻辑和界面展示分开,qml和C++就好比html和JavaScript。

qt中有大量的model/view类,视图类:QTableView、QListView和QTreeView,模型类:QAbstractTableModel、QAbstractListModel和QAbstractProxyModel,这三个模型类都是继承自QAbstractItemModel。对于qml语言来说,也有model和view,他们分别就是GridView、ListView和PathView,其中GridView和ListView在qt中都有对于的实现类,PathView是最难理解的view,也是最灵活的view,他可以做出各种各样比较绚丽的效果。

二、效果展示

这一节我们主要是说明qml中的视图类,如下效果图展示的那样,图1是用GridView实现,图2是用ListView实现,view的item项都是用代理进行绘制;图3是用PathView实现的一个效果图,类似于一个卡牌弹出弹入效果。

顺道提一嘴,qml文件都是可以使用qmlscene.exe来预览

图1 gridview效果图

图2 listview效果图

图3 pathview效果图

三、源码分析

每一个示例中都有大量的注释,具体细节可以参看注释

1、GridView增删

如图1所示,这是一个GridView的简单示例,示例完成单击Add Item按钮实现新增项,点击项实现删除等功能。

 import QtQuick 2.0

 Rectangle {
width: ;
height: ; //背景色渐变
gradient: Gradient {
GradientStop { position: 0.0; color: "#dbddde"; }
GradientStop { position: 1.0; color: "#5fc9f8"; }
} //list模型默认9项
ListModel {
id: theModel ListElement { number: ; }
ListElement { number: ; }
ListElement { number: ; }
ListElement { number: ; }
ListElement { number: ; }
ListElement { number: ; }
ListElement { number: ; }
ListElement { number: ; }
ListElement { number: ; }
ListElement { number: ; }
} //Add Item按钮
Rectangle {
anchors.left: parent.left;
anchors.right: parent.right;
anchors.bottom: parent.bottom;
anchors.margins: ; height: ; color: "#53d769";
border.color: Qt.lighter(color, 1.1); Text {
anchors.centerIn: parent; text: "Add item!";
} //点击时新增项 实现model的动态新增
MouseArea {
anchors.fill: parent; onClicked: {
theModel.append({"number": ++parent.count});
}
} property int count: ;//
} GridView {
anchors.fill: parent;
anchors.margins: ;
anchors.bottomMargin: ; clip: true; model: theModel;//绑定数据源 cellWidth: ;//设置项大小
cellHeight: ; delegate: numberDelegate;//设置绘制代理
} //自定义绘制代理
Component {
id: numberDelegate; Rectangle {
id: wrapper; width: ;
height: ; //首先是一个渐变的矩形框
gradient: Gradient {
GradientStop { position: 0.0; color: "#f8306a"; }
GradientStop { position: 1.0; color: "#fb5b40"; }
} //文本值是number的数值
Text {
anchors.centerIn: parent; font.pixelSize: ; text: number;
} //鼠标点击代理时,移除点击项
MouseArea {
anchors.fill: parent; onClicked: {
if (!wrapper.GridView.delayRemove)//是否延迟移除
{
theModel.remove(index);
}
}
} //GridView移除项 顺序动画
GridView.onRemove: SequentialAnimation {
//属性变化
PropertyAction {
target: wrapper;
property: "GridView.delayRemove";
value: true;
}
//数字动画
NumberAnimation {
target: wrapper;//目标对象
property: "scale";//执行动画的属性
to: ;//结束值
duration: ;//动画持续时长
easing.type: Easing.InOutQuad;//动画执行曲线
}
PropertyAction {
target: wrapper;
property: "GridView.delayRemove";
value: false;
}
} //GridView新增项 顺序动画
GridView.onAdd: SequentialAnimation {
NumberAnimation {
target: wrapper;
property: "scale";
from: ;//开始值
to: ;
duration: ;
easing.type: Easing.InOutQuad;
}
}
}
}
}

2、列表

如图2所示,是一个使用ListView实现的列表控件,点击列表控件中的项,可以实现最大化来展示列表的详细信息

 import QtQuick 2.0

 Item {
width: ;
height: ; //渐变别景色
Rectangle {
anchors.fill: parent;
gradient: Gradient {
GradientStop { position: 0.0; color: "#4a4a4a"; }
GradientStop { position: 1.0; color: "#2b2b2b"; }
}
} //主界面列表视图
ListView {
id: listView; anchors.fill: parent; delegate: detailsDelegate;//设置绘制代理
model: planets;//绑定数据源
} ListModel {
id: planets; ListElement {
name: "Mercury";
imageSource: "images/mercury.jpeg";
facts: "Mercury is the smallest planet in the Solar System. It is the closest planet to the sun. It makes one trip around the Sun once every 87.969 days." ;
}
ListElement {
name: "Venus";
imageSource: "images/venus.jpeg";
facts: "Venus is the second planet from the Sun. It is a terrestrial planet because it has a solid, rocky surface. The other terrestrial planets are Mercury, Earth and Mars. Astronomers have known Venus for thousands of years.";
}
ListElement {
name: "Earth";
imageSource: "images/earth.jpeg";
facts: "The Earth is the third planet from the Sun. It is one of the four terrestrial planets in our Solar System. This means most of its mass is solid. The other three are Mercury, Venus and Mars. The Earth is also called the Blue Planet, 'Planet Earth', and 'Terra'.";
}
ListElement {
name: "Mars";
imageSource: "images/mars.jpeg";
facts: "Mars is the fourth planet from the Sun in the Solar System. Mars is dry, rocky and cold. It is home to the largest volcano in the Solar System. Mars is named after the mythological Roman god of war because it is a red planet, which signifies the colour of blood.";
}
} Component {
id: detailsDelegate; Item {
id: wrapper; width: listView.width;
height: ; //列表项文本
Rectangle {
anchors.left: parent.left;
anchors.right: parent.right;
anchors.top: parent.top; height: ; color: "#333";
border.color: Qt.lighter(color, 1.2);
Text {
anchors.left: parent.left;
anchors.verticalCenter: parent.verticalCenter;
anchors.leftMargin: ; font.pixelSize: parent.height-;
color: '#fff'; text: name;//ListElement中的name
}
} //列表项图标
Rectangle {
id: image; width: ;
height: ; anchors.right: parent.right;
anchors.top: parent.top;
anchors.rightMargin: ;
anchors.topMargin: ; color: "yellow"; Image {
anchors.fill: parent; fillMode: Image.PreserveAspectFit; source: imageSource;//ListElement中的imageSource
}
} //鼠标点击列表项 进行状态前切换,
MouseArea {
anchors.fill: parent;
onClicked: parent.state = "expanded";//切换到展开状态
} //详情页展开时,文本详细信息
Item {
id: factsView; anchors.top: image.bottom;//位于放大后的图标底部
anchors.left: parent.left;
anchors.right: parent.right;
anchors.bottom: parent.bottom; opacity: ;//默认透明不显示 当点击代理项时该属性会慢慢变得可见 Rectangle {
anchors.fill: parent; gradient: Gradient {
GradientStop { position: 0.0; color: "#fed958"; }
GradientStop { position: 1.0; color: "#fecc2f"; }
}
border.color: '#000000';
border.width: ; Text {
anchors.fill: parent;
anchors.margins: ; clip: true;//可剪切
wrapMode: Text.WordWrap;//文本支持换行
color: '#1f1f21'; font.pixelSize: ; text: facts;
}
}
} //项最大化时 右上角关闭按钮
Rectangle {
id: closeButton; anchors.right: parent.right;
anchors.top: parent.top;
anchors.rightMargin: ;
anchors.topMargin: ; width: ;
height: ; color: "#157efb";
border.color: Qt.lighter(color, 1.1); opacity: ; MouseArea {
anchors.fill: parent;
onClicked: wrapper.state = "";//点击恢复到默认状态
}
} //自定义代理状态
states: [
State {
name: "expanded";
//在点击列表项后 各项属相变化 //代理高度铺满视图高度
PropertyChanges { target: wrapper; height: listView.height; }
//列表项的图标放大
PropertyChanges {
target: image;
width: listView.width;
height: listView.width;
anchors.rightMargin: ;
anchors.topMargin: //距离顶部30像素
}
//文本详细信息可见
PropertyChanges { target: factsView; opacity: ; }
//关闭按钮可见
PropertyChanges { target: closeButton; opacity: ; }
//列表项视图
PropertyChanges {
target: wrapper.ListView.view;
contentY: wrapper.y;
interactive: false
}
}
] //项变化时 过程
transitions: [
Transition {
NumberAnimation {
duration: ;
properties: "height,width,anchors.rightMargin,anchors.topMargin,opacity,contentY";
}
}
]
}
}
}

3、卡牌效果

示例代码可以直接放在qml文件中使用qmlscene.exe来预览

 import QtQuick 2.6

 Rectangle {
id: root;
width: ;
height: ; PathView
{
anchors.fill: parent; delegate: flipCardDelegate;
model: ; path: Path{
startX: root.width / ;
startY: PathAttribute { name: "itemAngle"; value: -45.0; }
PathAttribute { name: "itemScale"; value: 0.5; }
PathAttribute { name: "itemZ"; value: ; }//属性值附加到代理上面
PathLine { x: root.width/; y: root.height*0.4; }//路径元素定义
PathPercent { value: 0.48; }//控制两个元素之间的路径所占百分比
PathLine { x: root.width/; y: root.height*0.5; }
PathAttribute { name: "itemAngle"; value: 0.0; }
PathAttribute { name: "itemScale"; value: 1.0; }
PathAttribute { name: "itemZ"; value: }
PathLine { x: root.width/; y: root.height*0.6; }
PathPercent { value: 0.52; }
PathLine { x: root.width/; y: root.height; }
PathAttribute { name: "itemAngle"; value: 45.0; }
PathAttribute { name: "itemScale"; value: 0.5; }
PathAttribute { name: "itemZ"; value: ; }
} pathItemCount: ;//可见元素数目 preferredHighlightBegin: 0.5;
preferredHighlightEnd: 0.5;
}
Component{
id: flipCardDelegate; Rectangle{
id: wrapper; width: ;
height: ;
antialiasing: true;//反锯齿 //代理背景色渐变
gradient: Gradient{
GradientStop { position: 0.0; color: "#2ed5fa"; }
GradientStop { position: 1.0; color: "#2467ec"; }
} visible: PathView.onPath;//在PathView上的项可见,不在视图上的项不可见 scale: PathView.itemScale;//缩放
z: PathView.itemZ;//z值 数值大的在上面 property variant rotX: PathView.itemAngle;//属性别名 主要是因为要在底下这个旋转过程中使用 //动画过程旋转
transform: Rotation {
axis { x: ; y: ; z: ; }//绕x轴旋转
angle: wrapper.rotX;//旋转角度
origin { x: ; y: ; }//旋转基点
}
Text{
anchors.horizontalCenter: parent.horizontalCenter;
anchors.verticalCenter: parent.verticalCenter;
text: index;
}
}
}
}

四、相关文章

  qml基础学习(一) 基础概念

如果您觉得文章不错,不妨给个打赏,写作不易,感谢各位的支持。您的支持是我最大的动力,谢谢!!! 

 

很重要--转载声明

  1. 本站文章无特别说明,皆为原创,版权所有,转载时请用链接的方式,给出原文出处。同时写上原作者:朝十晚八 or Twowords
  2. 如要转载,请原文转载,如在转载时修改本文,请事先告知,谢绝在转载时通过修改本文达到有利于转载者的目的。

qml基础学习 模型视图(一)的更多相关文章

  1. qml基础学习 Canvas画笔

    一.画布元素 自qt4.7发布qml以来,qml也在一直不断的完善中,在qt4时代使用qml时如果需要异形图,那我们只能让设计师来切图,这样的感觉是很不爽的,总感觉开发没有那么犀利.但是到了qt5这一 ...

  2. qml基础学习 基础概念

    一.概括 学习qt已有2年多的时间,从qt4.7开始使用直到现在正在使用的qt5.6,基本都在windows机器上做开发.最近有意向看了下qt的qml部分,觉着还是挺不错的,毕竟可以做嵌入式移动端产品 ...

  3. SQL基础学习_04_视图

    视图 1. 视图的创建     视图就是保存好的SELECT语句,这些SELECT语句执行之后会产生新的表,所以在SQL中,视图和表是不做差别对待的,也就是SQL也可以对视图做一些操作:     由于 ...

  4. 学习模型-视图-控制器MVC模式

    1.MVC简介 MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑.数据.界面显示分 ...

  5. MySQL基础学习之视图

    创建新的视图 CREATE VIEW 视图名  AS SELECT  属性,属性1,属性2  FROM 表名 创建新的视图并指定数据名 CREATE VIEW 视图名(新属性,新属性1,新属性2)   ...

  6. Qt 学习之路:模型-视图高级技术

    PathView PathView是 QtQuick 中最强大的视图,同时也是最复杂的.PathView允许创建一种更灵活的视图.在这种视图中,数据项并不是方方正正,而是可以沿着任意路径布局.沿着同一 ...

  7. OpenGL学习笔记4——模型视图变换

    以日月地为例的一个模型视图变换.绕了比较多的弯路,下面是几个注意点总结. 注意点: 1.GL函数对模型的操作是基于当前局部坐标系,即模型坐标系而非世界坐标系,二者只在第一次初始化完毕之后才重合: 2. ...

  8. Java基础之在窗口中绘图——使用模型/视图体系结构在视图中绘图(Sketcher 1 drawing a 3D rectangle)

    控制台程序. 在模型中表示数据视图的类用来显示草图并处理用户的交互操作,所以这种类把显示方法和草图控制器合并在一起.不专用于某个视图的通用GUI创建和操作在SketcherFrame类中处理. 模型对 ...

  9. WEBGL学习【八】模型视图投影矩阵

    <!--探讨WEBGL中不同图形的绘制方法:[待测试2017.11.6]--> <!DOCTYPE HTML> <html lang="en"> ...

随机推荐

  1. .NET Framework3.0/3.5/4.0/4.5新增功能摘要

    Microsoft .NET Framework 3.0 .NET Framework 3.0 中增加了不少新功能,例如: Windows Workflow Foundation (WF) Windo ...

  2. 免费打造自己的个人网站,免费域名、免费空间、FTP、数据库什么的,一个不能少,没钱,也可以这么任性

    作为一名程序猿,拥有自己的个人网站,是一件多么有逼格的事~~至于个人网站的好处嘛?那是多的说都说不完啊~~例如我们可以放自己的作品,展示自己的风采,放自己女神的照片(女神看到后会怎么样,自己想吧,哈哈 ...

  3. Java提高篇(三三)-----Map总结

    在前面LZ详细介绍了HashMap.HashTable.TreeMap的实现方法,从数据结构.实现原理.源码分析三个方面进行阐述,对这个三个类应该有了比较清晰的了解,下面LZ就Map做一个简单的总结. ...

  4. No resource found that matches the given name 'android:Widget.Material.A解决方案

    1:首先新建空白工作区 2:先import appcompat_v7 appcompat_v7在一个类似这样的地方, C:\mywork\android\android-sdk-windows\ext ...

  5. Android移动APP开发笔记——Cordova(PhoneGap)通过CordovaPlugin插件调用 Activity 实例

    引言 Cordova(PhoneGap)采用的是HTML5+JavaScript混合模式来开发移动手机APP,因此当页面需要获取手机内部某些信息时(例如:联系人信息,坐标定位,短信等),程序就需要调用 ...

  6. Hibernate SQL实际sql语句监控- p6spy+hibernate+proxool 设置

    由于ORM工具的缘故,我们调试程序的时候远没有直接在程序里直接写个string的SQL简单,想当年查个sql是有多么的幸福,一行sql = "select * from ..."找 ...

  7. CSS的两个小知识点 伪类选择器和display:table-cell

    li:first-child {color:red} li:nth-child(3n) {color: red} 在对nth-child传参的时候,已经直接用公式,3n就表示3的倍数.多用伪类和伪元素 ...

  8. 删除xcode 里的多余证书

    删除xcode 里的多余证书 方法一: command+shift+G 前往文件夹: ~/Library/MobileDevice/Provisioning Profiles 方法二: 进入xcode ...

  9. Liferay7 BPM门户开发之46: 集成Activiti用户、用户组、成员关系同步

    在实际的BPM集成开发过程中,Liferay和Activiti这两个异构的系统之间,用户.组的同步需求非常重要,用来实现签收组的概念,比如指定签收组.会签.抢签都需要用到. Activiti可以通过自 ...

  10. KnockoutJS 3.X API 第五章 高级应用(2) 控制后代绑定

    注意:这是一种高级技术,通常仅在创建可重用绑定的库时使用. 默认情况下,绑定仅影响它们应用到的元素. 但是如果你想影响所有的后代元素呢? 为此,只需从绑定的init函数中返回{controlsDesc ...