QT QML目录导航列表视图

【功能】

/目录、文件
/文件过滤
/递归
/事件
/高亮当前行
/当前选项
/目录切换动画
/限制根目录

【下载】:http://download.csdn.net/detail/surfsky/8311503

【核心代码】

  1 import QtQuick 2.0
  2 import Qt.labs.folderlistmodel 2.1
  3
  4
  5 /**
  6 QML目录导航列表
  7     /目录文件
  8     /文件过滤
  9     /递归
 10     /事件
 11     /高亮当前行
 12     /当前选项
 13     /目录切换动画
 14     /限制根目录
 15
 16 usage:
 17     FolderListView{
 18         onItemClicked:{
 19             console.debug(JSON.stringify(item));
 20         }
 21     }
 22
 23 author:
 24     surfsky.cnblogs.com
 25     2014-11
 26 */
 27 ListView {
 28     id: lv
 29     width: 300
 30     height: 600
 31
 32     //-----------------------------------------
 33     // public
 34     //-----------------------------------------
 35     property int rowHeight: 30                    // 行高
 36     property int fontSize: 20                     // 字体大小
 37     property color hightlightColor: "#d0d0d0"     // 高亮行背景色
 38     property var fileFilter : ["*.qml"]           // 文件过滤器
 39     property string initFolder: ‘./‘              // 初始目录
 40     property string rootFolder : ‘../‘            // 限制根目录,不可再往上查找
 41
 42     // 点击事件(包括文件和目录)
 43     signal itemClicked(var item);
 44
 45
 46     //-----------------------------------------
 47     // 模型
 48     //-----------------------------------------
 49     model: folderModel
 50     FolderListModel {
 51         id: folderModel
 52         nameFilters: lv.fileFilter
 53         folder: lv.initFolder
 54         showDirsFirst: true
 55         showDotAndDotDot: true
 56     }
 57
 58
 59     //-----------------------------------------
 60     // 场景切换动画
 61     //-----------------------------------------
 62     PropertyAnimation on x{id: aniForward; from: lv.width; to: 0}
 63     PropertyAnimation on x{id: aniBack; from: -lv.width; to: 0}
 64
 65
 66
 67     //-----------------------------------------
 68     // 高亮行
 69     //-----------------------------------------
 70     highlightFollowsCurrentItem: false
 71     highlight: Rectangle {
 72         width: lv.width;
 73         height: lv.rowHeight
 74         color: hightlightColor
 75         y: lv.currentItem.y;
 76         Behavior on y { PropertyAnimation { properties: ‘y‘; duration: 300; easing.type: Easing.OutExpo } }
 77         //Behavior on y { SpringAnimation { spring: 2; damping: 0.1; duration:100 } }
 78     }
 79
 80
 81     //-----------------------------------------
 82     // 代理
 83     //-----------------------------------------
 84     delegate: Item{
 85         width: parent.width
 86         height: lv.rowHeight
 87         Text {
 88             text: fileName
 89             anchors.verticalCenter: parent.verticalCenter
 90             anchors.leftMargin: 10
 91             font.pixelSize: lv.fontSize
 92             x: 5
 93         }
 94         Text {
 95             text: ">";
 96             visible:fileIsDir;
 97             anchors.verticalCenter: parent.verticalCenter
 98             anchors.right: parent.right;
 99             anchors.rightMargin: 10
100             font.pixelSize: lv.fontSize
101         }
102         Rectangle{
103             width: parent.width
104             height:1
105             color: ‘#f0f0f0‘
106             y: parent.height - 1
107             x: 0
108         }
109
110         MouseArea{
111             anchors.fill:  parent
112             onClicked: {
113                 parent.ListView.view.currentIndex = index
114
115                 // 触发节点点击事件
116                 var json = {
117                     isDir: fileIsDir,
118                     name: fileName,
119                     path: filePath,
120                     url: fileURL.toString(),
121                     baseName: fileBaseName,
122                     suffix: fileSuffix,
123                     size: fileSize,
124                     modified: fileModified,
125                     accessed: fileAccessed,
126                     folderUrl: getFolder(fileURL.toString())
127                 };
128                 console.debug(JSON.stringify(json));
129                 lv.itemClicked(json);
130
131                 // 目录处理
132                 if (fileIsDir){
133                     // 限制根目录
134                     if (lv.rootFolder != ‘‘){
135                         var folderURL = (fileURL + ‘/‘).toLowerCase();
136                         var rootFolderURL = Qt.resolvedUrl(lv.rootFolder).toLowerCase();
137                         if (rootFolderURL.indexOf(folderURL) != -1){
138                             console.log(‘limit root: ‘ + rootFolderURL);
139                             return;
140                         }
141                     }
142                     changeFolder(json.name, json.url);
143                 }
144             }
145
146             // 获取文件所在的目录
147             function getFolder(filePath)
148             {
149                 var n = filePath.lastIndexOf(‘/‘);
150                 var folder = filePath.substr(0, n+1);
151                 return folder;
152             }
153
154             // 更改目录(修改model并启动相应的动画)
155             function changeFolder(folderName, folderURL){
156                 //folderModel.showDotAndDotDot = folderURL!=rootFolderURL;  // (无效)
157                 folderModel.folder = folderURL;
158                 if (folderName == ‘..‘)     aniBack.start();
159                 else if (folderName == ‘.‘) ;
160                 else                        aniForward.start();
161             }
162         }
163     }
164
165
166 }
时间: 2024-10-05 22:09:10

QT QML目录导航列表视图的相关文章

Qt qml中listview 列表视图控件(下拉刷新、上拉分页、滚动轴)

Qt qml中listview 列表视图控件(下拉刷新.上拉分页.滚动轴) 来源 https://www.cnblogs.com/surfsky/p/4352898.html 设置ListView涉及到将contentsY,即视图的可见部分的顶部,设置y为委托的值.另一个更改是interactive将视图设置为false.这样可以防止视图移动.用户不能再滚动列表或更改当前Item. contentY为列表上拉后列表左上角点距显示框左上解点的高度listView1.height为可显示部分的高度,

Qt 学习之路 :视图代理

与 Qt model/view 架构类似,在自定义用户界面中,代理扮演着重要的角色.模型中的每一个数据项都要通过一个代理向用户展示,事实上,用户看到的可视部分就是代理. 每一个代理都可以访问一系列属性和附加属性.这些属性及附加属性中,有些来自于数据模型,有些则来自于视图.前者为代理提供了每一个数据项的数据信息:后者则是有关视图的状态信息. 代理中最常用到的是来自于视图的附加属性ListView.isCurrentItem和ListView.view.前者是一个布尔值,用于表示代理所代表的数据项是

qml基础学习 模型视图(一)

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

[转]JavaScript自动生成博文目录导航

转自:http://www.cnblogs.com/xdp-gacl/p/3718879.html 我们在写博客的时候,如果博文里面有目录,会给人结构清晰.一种一目了然的感觉,看目录就知道这篇博文要讲解的内容,并且点击目录标题就可以跳转到具体的内容,这样园友们在看博客的时候就可以很方便地浏览自己感兴趣的内容,但是遗憾的是博客园不支持博文目录的生成,好像也有园友给博客园提建议,希望能够像CSDN那样能够自动生成博文目录,但是不知道是什么原因,博客园一直都没有把这个功能加上去,既然没有,那我就自己做

Qt QML referenceexamples attached Demo hacking

/********************************************************************************************* * Qt QML referenceexamples attached Demo hacking * 说明: * 1. 本源代码来自Qt自带的Example,而本文也仅仅是代码解读,需要有点基础: * 2. 由于是Qt自带Demo,分为几个文件,文件存在联系,而本人把所有代码放在这个文件里,会照成阅读困难:

JavaScript自动生成博文目录导航

我们在写博客的时候,如果博文里面有目录,会给人结构清晰.一种一目了然的感觉,看目录就知道这篇博文要讲解的内容,并且点击目录标题就可以跳转到具体的内容,这样园友们在看博客的时候就可以很方便地浏览自己感兴趣的内容,但是遗憾的是博客园不支持博文目录的生成,好像也有园友给博客园提建议,希望能够像CSDN那样能够自动生成博文目录,但是不知道是什么原因,博客园一直都没有把这个功能加上去,既然没有,那我就自己做吧,研究了2天,总算是按照自己的设想做出来了,最终效果如下: 下面来介绍一下这个小工具的实现. 一.

Qt 学习之路:视图选择 (QItemSelectionModel)

选择是视图中常用的一个操作.在列表.树或者表格中,通过鼠标点击可以选中某一项,被选中项会变成高亮或者反色.在 Qt 中,选择也是使用了一种模型.在 model/view 架构中,这种选择模型提供了一种更通用的对选择操作的描述.对于一般应用而言,Qt 内置的选择模型已经足够,但是,Qt 还是允许你创建自己的选择模型,来实现一些特殊的操作. Qt 使用QItemSelectionModel类获取视图中项目的选择情况.这个模型保持有项目的索引,并且独立于任何视图.这意味着,我们可以让不同的视图共享同一

Android——列表视图(ListView)

列表视图是android中最常用的一种视图组件,它以垂直列表的形式列出需要显示的列表项.在android中有两种方法向屏幕中添加列表视图:一种是直接使用ListView组件创建:另外一种是让Activity继承ListActivity实现.下面分别介绍这两种方法: 一.直接使用ListView组件创建 在布局文件中首先添加ListView 代码如下: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/androi

【Android UI设计与开发】第11期:顶部标题栏(二)ActionBar实现Tab选项卡和下拉导航列表

转载请注明出处:http://blog.csdn.net/yangyu20121224/article/details/9050573  在上一篇文章中,我们只是大概的了解了一下关于ActionBar这个类的简单用法,今天我会继续以实例进行更加深入的讲解. 一.实现Tab选项标签 当你想要在一个Activity中提供Tab选项卡时,使用ActionBar的Tab选项标签是一个非常好的选择(而不是使用TabWidget类),因为系统会调整ActionBar的选项标签来适应不同尺寸的屏幕的需要,比如