QListView 類別

Qt3 Gossip: QListView 類別

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 <qapplication.h>
#include <qlistview.h>
#include <qdir.h>
#include <qfileinfo.h>
#include <qpixmap.h>

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、付费专栏及课程。

余额充值