Qlistview用法例子

來源:互聯網
上載者:User

//model有以下幾種:
// QStringListModel                   儲存一組字串
// QStandardItemModel            儲存任意階層的資料
// QDirModel                             對檔案系統進行封裝
// QSqlQueryModel                   對SQL的查詢結果集進行封裝
// QSqlTableModel                    對SQL中的table進行封裝
// QSqlRelationalTableModel    對帶有foreign key的SQL table進行封裝
// QSortFilterProxyModel         對另一個model執行sort and/or filter
//  model中存放的每項資料都有相應的"model index",由QModelIndex類來表示。
//  每個index由三個部分構成:row,column和表明所屬model的指標。對於一維的list model,column部分永遠為0。
//下面是兩個例子(此執行個體可適當改動),介紹了QStringListModel,QStandardItemModel,QDirModel用QTreeView和QListView來顯示的例子
//建一個cpp檔案 拷貝以下代碼即可
#include <QApplication>
#include <QWidget>
#include<QTreeView>
#include<QDirModel>
#include<QHBoxLayout>
#include<QSplitter>
#include<QStringListModel>
#include<QListView>
#include<QStandardItemModel>
int main(int argc, char *argv[]) {
    /*
    QApplication app(argc, argv);

   
//以下是QStandardItemModel的簡單使用,只需替換view的model為qstmodel就可以看到效果
    QStandardItemModel *qstmodel=new QStandardItemModel();
    QStandardItem* item1    = new QStandardItem("item1");
    QStandardItem* item2    = new QStandardItem("item2");
    QStandardItem* item3    = new QStandardItem("item3");
    item1->appendRow(item2);
    qstmodel->appendRow(item1);
    qstmodel->appendRow(item3);
//以下是StringListModel的樣本,只需替換view的model為mod就可以看到效果,QListView也適用
    QStringList names;
    names<<"a"<<"b";
     QAbstractItemModel *mod=new QStringListModel(names);
//要注意的是,這裡把StringListModel作為一個QAbstractItemModel來使用。這樣我們就可以
  //使用model中的抽象介面,而且如果將來我們用別的model代替了當前這個model,這些代碼也會照樣工作。
  //QListView提供的列表視圖足以滿足當前這個model的需要了。
     QDirModel *model=new QDirModel;
        QTreeView *view=new QTreeView;
//這裡設定Model即可
          view->setModel(model);
           view->setSelectionMode(QAbstractItemView::SingleSelection);
        view->setAutoFillBackground(true);
//設定列是否隱藏
//      view->setColumnHidden(1,true);
//      view->setColumnHidden(2,true);
//      view->setColumnHidden(3,true);
     //   widget->setAutoFillBackground(true);
        QHBoxLayout *blayout=new QHBoxLayout;
        blayout->addWidget(view);
        blayout->addStretch();
        QSplitter *splitter = new QSplitter;
        splitter->setLayout(blayout);
//splitter->addWidget(view);
        splitter->show();
    //     widget->show();
         return app.exec();
         */

         QApplication app(argc, argv);
           QSplitter *splitter = new QSplitter;
     //從預設目錄建立資料

           QDirModel *model = new QDirModel;
    
           QTreeView *tree = new QTreeView(splitter);
  //配置一個view去顯示model中的資料,只需要簡單地調用 setModel(),並把目錄model作為參數傳遞
           tree->setModel(model);
//setRootIndex()告訴views顯示哪個目錄的資訊,這需要提供一個model index,然後用這個
           //model index去model中去擷取資料,這裡預設的是當前路徑
           tree->setRootIndex(model->index(QDir::currentPath()));
           QListView *list = new QListView(splitter);
           list->setModel(model);
//index()這個函數是QDirModel特有的,通過把一個目錄做為參數,得到了需要的model index
           //其他的代碼只是視窗show出來,進入程式的事件迴圈就好了
           list->setRootIndex(model->index(QDir::currentPath()));         
         
            splitter->setWindowTitle("Two views onto the same directory model");
           splitter->show();
           return app.exec();
}

void Auditctl_Win::save()
{
  /*  if ( !listView->firstChild() )
        return;

    QFile f( filename );
    if ( !f.open( IO_WriteOnly ) )
        return;

    QTextStream t( &f );

    QListViewItemIterator it( listView );

    for ( ; it.current(); ++it )
        for ( unsigned int i = 0; i < 50; i++ )
            t << it.current()->text( i ) << "\n";

    f.close();*/
}

void Auditctl_Win::load( const QString &filename )
{
    //listView->clear();
    QFile f( filename );
    if ( !f.open( QIODevice::ReadOnly) )
        return;
    QTextStream t( &f );
    while ( !t.atEnd() )
 {
  QString string = static_cast<QString>(t.readLine());
  QStandardItem *item = new QStandardItem(string);
  standardItemModel->appendRow(item);
  listView->setModel(standardItemModel);
    }

實現彩色選框
   standardItemModel = new QStandardItemModel(this); 
    /*QStringList strList; 
    strList.append("string1"); 
    strList.append("string2"); 
    strList.append("string3"); 
    strList.append("string4"); 
    strList.append("string5"); 
    strList.append("string6"); 
   strList.append("string7"); 
    strList << "string8"; 
    strList += "string9"; 
    int nCount = strList.size(); 
   for(int i = 0; i < nCount; i++) 
   { 
   QString string = static_cast<QString>(strList.at(i)); 
       QStandardItem *item = new QStandardItem(string);    
    if(i % 2 == 1)       
    { 
           QLinearGradient linearGrad(QPointF(0, 0), QPointF(200, 200)); 
            linearGrad.setColorAt(0, Qt::darkGreen); 
            linearGrad.setColorAt(1, Qt::yellow); 
            QBrush brush(linearGrad); 
           item->setBackground(brush); 
        }       
  standardItemModel->appendRow(item); 
    } 
    listView->setModel(standardItemModel);   */
 //  listView->setFixedSize(200,300);     f.close();
}

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()進行遞迴查詢。

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

下圖是程式執行時的畫面:

 



 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.