listview qt 选中内容_qt-listview用法

本文介绍了如何使用Qt中的QListView组件创建一个显示文件目录树的界面。通过QListViewItem和QCheckListItem,配合QDir类递归查询文件系统,将目录和文件以树形结构展示,并通过设置不同图标区分目录和文件。
摘要由CSDN通过智能技术生成

QListView

類別提供樹狀的列示元件,可以顯示多欄與樹狀結構,它常與QListViewItem或者是QCheclListItem一同使用;使用

QListView最簡單的方式,就是以QListView作為樹根,並使用addColumn()方法加入欄位,然後使用QListViewItem或

QCheckListItem指定這個QListView作父節點,例如:

QListView *root;

root->addColumn( "Name"

);

root->addColumn( "Size"

);

QListViewItem element = new

QListViewItem(root, "fName", "fSize");

上面是在QListView中加入一個QListViewItem的方法,我們也可以指定一個QListViewItem作為父節點,而子節點會自動內縮於父節點之內;通常若要加入至樹枝或樹葉的項目是有一個規律,例如HTML或是XML文件,我們會使用迴圈來加入這些項目,例如下面的程式片段加入新的屬性項目至之前的element子節點之中,成為它的子節點:

for ( int i = 0 ; i <

attributes.length(); i++ ) {

new QListViewItem(element, attributes.qName(i), attributes.uri(i)

);

}

下面這個程式我們綜合前面的FileInfo類別與QDir類別,使用遞迴查詢出使用者家目錄下的所有目錄與檔案,但不包括隱藏檔與符號連結,我們將查詢的結果分為目錄與檔案,並使用QListView類別的樹狀結構加以顯示:

#include

#include

#include

#include

#include

void dirlist(QListViewItem*, QFileInfo*);

int main(int argc, char **argv) {

QApplication app(argc, argv);

QListView *root = new QListView();

root->addColumn("Name");

root->addColumn("Size");

QDir d = QDir::home();

d.setFilter(QDir::Files | QDir::Dirs | QDir::NoSymLinks);

d.setSorting(QDir::DirsFirst | QDir::Name);

const QFileInfoList *list = d.entryInfoList();

QFileInfoListIterator it(*list);

QFileInfo *fi;

QListViewItem *child;

while((fi = it.current()) != 0) {

if ( fi->fileName() == "." || fi->fileName() == ".." );

else if(fi->isDir()) {

child = new QListViewItem(root, fi->fileName().latin1(), "dir");

child->setPixmap(0, QPixmap( "dirclosed.xpm" ));

dirlist(child, fi);

}

else {

child = new QListViewItem(root,

fi->fileName().latin1(), QString::number(fi->size()));

child->setPixmap(0, QPixmap( "file.xpm" ));

}

++it;

}

app.setMainWidget(root);

root->show();

return app.exec();

}

void dirlist(QListViewItem *parent, QFileInfo *pfi) {

QDir d;

d.setPath(pfi->filePath());

d.setFilter(QDir::Files | QDir::Dirs | QDir::NoSymLinks);

d.setSorting(QDir::DirsFirst | QDir::Name);

const QFileInfoList *list = d.entryInfoList();

QFileInfoListIterator it(*list);

QFileInfo *fi;

QListViewItem *child;

while((fi = it.current()) != 0) {

if ( fi->fileName() == "." || fi->fileName() == ".." );

else if(fi->isDir()) {

child = new QListViewItem(parent, fi->fileName().latin1(), "dir");

child->setPixmap(0, QPixmap("dirclosed.xpm" ));

dirlist(child, fi);

}

else {

child = new QListViewItem(parent,

fi->fileName().latin1(), QString::number(fi->size()));

child->setPixmap(0, QPixmap("file.xpm" ));

}

++it;

}

}

QListView本身的使用基本上很簡單,這個程式本身反而是遞迴查詢的部份要注意,其中我們查詢到的".."與"."並不作任何的處理,而若查詢到是目錄,就將之加入QListView樹狀結構中,然後以該目錄名稱作基礎,再次呼叫dirlist()進行遞迴查詢。

為了分辨是目錄或檔案,我們簡單的使用兩個圖案作區別,您也可以進一步配合事件處理,讓目錄的圖案在按下後,會有開啟與關閉的差別,這就請自己試試看吧! 下圖是程式執行時的畫面:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值