Qt qml treeview 树控件

qml并没有提供树控件,只能自己写了。model仍然用ListModel对象,弄成层级的就行。delegate必须用loader动态的增加子控件,如此而已。

【先看效果】

【下载】

http://download.csdn.net/detail/surfsky/8406181

【核心代码】

  1 import QtQuick 2.1
  2 import QtQuick.Controls 1.0
  3
  4
  5 /**
  6 树控件
  7 作者:surfsky.cnblogs.com 2014-10
  8 协议:MIT 请保留本文档说明
  9 功能
 10     /递归树显示
 11     /左侧一个箭头,点击可展开显示子树
 12     /选中节点变色
 13     /节点点击事件
 14     /tag属性,携带类似id的数据
 15     异步方式,点击箭头后请求子数据。异步模式的话,节点要加上isLeaf属性,点击箭头后动态加载数据
 16 使用
 17     TreeView {
 18         anchors.fill: parent
 19         id: tree
 20         model: modelTree2
 21         onSelectedItemChanged: console.log(item.text)
 22     }
 23     ListModel {
 24         id: modelTree2
 25         Component.onCompleted: {
 26             modelTree2.append([
 27                 {title: "Node 1"},
 28                 {title: "Node 2", items: [
 29                     {title: "Node 21", items:[
 30                       {title: "Node 211"},
 31                       {title: "Node 212"}
 32                       ]},
 33                     {title: "Node 22"}
 34                   ]
 35                 },
 36                 {title: "Node 3"}
 37             ]);
 38         }
 39     }
 40 参考 http://qt-project.org/forums/viewthread/30521/
 41 */
 42 ScrollView {
 43     id: view
 44     frameVisible: true
 45     implicitWidth: 200
 46     implicitHeight: 160
 47
 48     // 输入属性
 49     property var model
 50     property int rowHeight: 19
 51     property int columnIndent: 22
 52     property string expanderImage : "expander.png";
 53
 54     // 私有属性
 55     property var currentNode  // 当前节点数据
 56     property var currentItem  // 当前节点UI
 57
 58     // 信号
 59     signal selectedItemChanged(var item)
 60
 61
 62     // 节点数据展示的UI
 63     property Component delegate: Label {
 64         id: label
 65         text: model.title ? model.title : 0
 66         color: currentNode === model ? "white" : "black"
 67         property var tag : model.tag
 68     }
 69
 70     //
 71     contentItem: Loader {
 72         id: content
 73         onLoaded: item.isRoot = true
 74         sourceComponent: treeBranch
 75         property var items: model
 76
 77         // 背景条纹
 78         Column {
 79             anchors.fill: parent
 80             Repeater {
 81                 model: 1 + Math.max(view.contentItem.height, view.height) / rowHeight
 82                 Rectangle {
 83                     objectName: "Faen"
 84                     color: index % 2 ? "#eee" : "white"
 85                     width: view.width ; height: rowHeight
 86                 }
 87             }
 88         }
 89
 90         // 树节点组件
 91         Component {
 92             id: treeBranch
 93             Item {
 94                 id: root
 95                 property bool isRoot: false
 96                 implicitHeight: column.implicitHeight
 97                 implicitWidth: column.implicitWidth
 98                 Column {
 99                     id: column
100                     x: 2
101                     Item { height: isRoot ? 0 : rowHeight; width: 1}
102                     Repeater {
103                         model: items
104                         Item {
105                             id: filler
106                             width: Math.max(loader.width + columnIndent, row.width)
107                             height: Math.max(row.height, loader.height)
108                             property var _model: model
109                             // 当前行背景色块
110                             Rectangle {
111                                 id: rowfill
112                                 x: view.mapToItem(rowfill, 0, 0).x
113                                 width: view.width
114                                 height: rowHeight
115                                 visible: currentNode === model
116                                 color: "#37f"
117                             }
118                             // 行点击响应区域
119                             MouseArea {
120                                 anchors.fill: rowfill
121                                 onPressed: {
122                                     currentNode = model
123                                     currentItem = loader
124                                     forceActiveFocus()
125                                     selectedItemChanged(model);
126                                 }
127                             }
128                             // 行数据UI
129                             Row {
130                                 id: row
131                                 // 行图标
132                                 Item {
133                                     width: rowHeight
134                                     height: rowHeight
135                                     opacity: !!model.items ? 1 : 0
136                                     Image {
137                                         id: expander
138                                         source: view.expanderImage
139                                         height: view.rowHeight * 0.6
140                                         fillMode: Image.PreserveAspectFit
141                                         opacity: mouse.containsMouse ? 1 : 0.7
142                                         anchors.centerIn: parent
143                                         rotation: loader.expanded ? 90 : 0
144                                         Behavior on rotation {NumberAnimation { duration: 120}}
145                                     }
146                                     MouseArea {
147                                         id: mouse
148                                         anchors.fill: parent
149                                         hoverEnabled: true
150                                         onClicked: loader.expanded = !loader.expanded
151                                     }
152                                 }
153                                 // 行文本
154                                 Loader {
155                                     property var model: _model
156                                     sourceComponent: delegate
157                                     anchors.verticalCenter: parent.verticalCenter
158                                 }
159                             }
160
161                             // 子树(递归自身)
162                             Loader {
163                                 id: loader
164                                 x: columnIndent
165                                 height: expanded ? implicitHeight : 0
166                                 property var node: model
167                                 property bool expanded: false
168                                 property var items: model.items
169                                 property var text: model.title
170                                 sourceComponent: (expanded && !!model.items) ? treeBranch : undefined
171                             }
172                         }
173                     }
174                 }
175             }
176         }
177     }
178 }
时间: 2024-10-22 21:27:23

Qt qml treeview 树控件的相关文章

表格树控件QtTreePropertyBrowser编译成动态库(设计师插件)

目录 一.回顾 二.动态库编译 1.命令行编译动态库和测试程序 2.vs工具编译动态库和测试程序 3.安装文档 4.测试文档 三.设计师插件编译 1.重写QDesignerCustomWidgetInterface 2.添加到插件列表 3.拷贝生成的dll 4.重启Qt Designer 四.多说一句 五.相关文章 一.回顾 上一篇文章超级实用的表格树控件--QtTreePropertyBrowser讲了怎么去编译QtTreePropertyBrowser库,并且可以简单实用.由于我下载的库是基

PyQt5复杂控件(树控件、选项卡控件(滚动条控件、多文档控件、停靠控件)

1.树控件的基本使用方法QTreeWidget'''QTreeWidget树控件的使用方法添加图标,添加表格,添加复选框等'''from PyQt5.QtWidgets import *from PyQt5.QtCore import Qtfrom PyQt5.QtGui import QIcon,QBrush,QColorimport sys class treewidget(QMainWindow): def __init__(self): super(treewidget,self).__

基于MVC+EasyUI的Web开发框架经验总结(2)- 使用EasyUI的树控件构建Web界面

最近花了不少时间在重构和进一步提炼我的Web开发框架上,力求在用户体验和界面设计方面,和Winform开发框架保持一致,而在Web上,我主要采用EasyUI的前端界面处理技术,走MVC的技术路线,在重构完善过程中,很多细节花费不少时间进行研究和提炼,一步步走过来,也积累了不少经验,本系列将主要介绍我在进一步完善我的Web框架基础上积累的经验进行分享,本随笔主要介绍使用EasyUI的树控件构建Web界面的相关经验. 在很多界面设计上,我们可能都需要引入树列表控件,这个控件可以用zTree来实现,也

MFC之树控件

树控件对应的类: CTreeControl 添加树节点: 1 HTREEITEM hRootNode = m_tvwTree.InsertItem(_T("人")); 2 HTREEITEM hNode = m_tvwTree.InsertItem(_T("老人"), hRootNode, TVI_LAST); 3 HTREEITEM hChildNode = m_tvwTree.InsertItem(_T("男人"), hNode, TVI_L

基于MVC4+EasyUI的Web开发框架经验总结(2)- 使用EasyUI的树控件构建Web界面

最近花了不少时间在重构和进一步提炼我的Web开发框架上,力求在用户体验和界面设计方面,和Winform开发框架保持一致,而在Web上,我主要采用EasyUI的前端界面处理技术,走MVC的技术路线,在重构完善过程中,很多细节花费不少时间进行研究和提炼,一步步走过来,也积累了不少经验,本系列将主要介绍我在进一步完善我的Web框架基础上积累的经验进行分享,本随笔主要介绍使用EasyUI的树控件构建Web界面的相关经验. 在很多界面设计上,我们可能都需要引入树列表控件,这个控件可以用zTree来实现,也

树控件

1.相关类 CTreeCtrl -树控件,父类是CWnd,是一个控件,通常在对话框中使用. CTreeView -树视图,父类是CCtrlView,是一个视图,通常在文档视图应用程序中使用. 通过调用CTreeView::GetTreeCtrl,获取控件 2.CTreeCtrl的使用 2.1设置树控件的图标列表 1--创建图标列表 CImageList::Create 2--设置控件的图标列表 CTreeCtrl::SetImageList 2.2插入树节点 CTreeCtrl::InsertI

自定义的jquery ui树控件

简单的自定义jquery ui树控件,用于机构人员,支持自动加载下级节点数据 jQuery.widget("xway.Tree", { _Node: function(data) { this.id = data.type + "_" +data.id; this.trid = "tr_" + this.id; this.label = data.label; this.parent = null; this.tree = null; this.

.Net常用技巧_树控件工具类

using System; using System.Collections.Generic; using System.Text; using System.Collections; using DevComponents.AdvTree; namespace MyUtility { /// <summary> /// 树控件工具类 /// </summary> public class TreeTool { ArrayList selectArray = new ArrayLi

Android 实现自定义多级树控件和全选与反选的效果

博文开始之前,首先要感谢大牛:(lmj623565791),本博文是在其博文http://blog.csdn.net/lmj623565791/article/details/40212367基础上进一步的修改而来. 本博文主要是利用ListView实现多级树控件,并通过CheckBox来对各节点的全选与反选的功能,首先来看一下效果: 对于多级树的显示其实就是通过数据中各个节点的关系,通过不同的缩进来达到树的效果.而数据中主要要把握id,父节点pId,name的关系,来显示其效果. 代码实现如下