QT 常用部件 (三)QTreeView 文件浏览器


树控件QTreeView实现
2009-11-23 11:50

方法一:使用QDirModel进行目录的现实,QDirModel是QT中专为文件目录树型显示所提供的一种model。 具体使用如下:

#include <QtGui>

int main(int argc, char *argv[])

QApplication app(argc, argv);
QSplitter *splitter = new QSplitter;
        QDirModel *model = new QDirModel;
//从缺省目录创建数据
QTreeView *tree = new QTreeView(splitter);
tree->setModel(model);
tree->setRootIndex(model->index("c:\\"));
//配置一个view去显示model中的数据,只需要简单地调用setModel(),并把目录model作为参数传递
//setRootIndex()告诉views显示哪个目录的信息,这需要提供一个model index,然后用这个
//model index去model中去获取数据
//index()这个函数是QDirModel特有的,通过把一个目录做为参数,得到了需要的model index
//其他的代码只是窗口show出来,进入程序的事件循环就好了
QTextCodec::setCodecForTr(QTextCodec::codecForName("GBK"));   //中文显示
        QTextCodec *codec = QTextCodec::codecForLocale();
QString a = codec->toUnicode("目录");
splitter->setWindowTitle(a);
splitter->show();
return app.exec();
}
显示结果如下所示:

QTreeView - 春天 - 若能一切随他去,便是人间自在人

方法二:自行设置树型结构。

"Treeview.h"文件

#include <QtGui>
class TreeView :public QTreeView
{
public:
TreeView();
void iterateOverItems();
QList<QStandardItem*> returnTheItems();
void mouseDoubleClickEvent(QMouseEvent *event);
private:
QStandardItemModel *model;
};

"Treeview.cpp"文件

#include "treeview.h"

TreeView::TreeView() : QTreeView()
{      
QTextCodec::setCodecForTr(QTextCodec::codecForName("GBK"));
model = new QStandardItemModel(4,2);
model->setHeaderData(0, Qt::Horizontal, tr("Service"));
model->setHeaderData(1, Qt::Horizontal, tr("Details"));
QStandardItem *item1 = new QStandardItem("avahi-daemon");
item1->setIcon(QIcon("gparted.png"));
QStandardItem *item2 = new QStandardItem("bluetooth");
item2->setIcon(QIcon("gparted.png"));
QStandardItem *item3 = new QStandardItem("crond");
    item3->setIcon(QIcon("gparted.png")); 
QStandardItem *item4 = new QStandardItem("cups");
item4->setIcon(QIcon("gparted.png")); 
model->setItem(0, 0, item1);
model->setItem(1, 0, item2);
model->setItem(2, 0, item3);
model->setItem(3, 0, item4);
QStandardItem *item5 = new QStandardItem("fifth");
item4->appendRow(item5);

QModelIndex parent;
for (int i = 0; i < 4; ++i) {
   parent = model->index(0, 0, parent);
   model->insertRows(0, 1, parent);
   model->insertColumns(0, 1, parent);
   QModelIndex index = model->index(0, 0, parent);
   model->setData(index, i);
}
this->setModel(model);
}

QList<QStandardItem*> TreeView::returnTheItems()
{
return model->findItems("*", Qt::MatchWildcard | Qt::MatchRecursive);
}

void TreeView::iterateOverItems()
{
QList<QStandardItem*> list = returnTheItems();

foreach (QStandardItem* item, list) {
   qDebug() << item->text();
}
}
void TreeView::mouseDoubleClickEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton) {
   QModelIndex index0 = currentIndex();
   qDebug() << index0.data().toString();
}
}

"Main.cpp"文件

#include <QtGui/QApplication>
#include "treeview.h"

int main(int argc, char *argv[])
{
QApplication app(argc, argv);
TreeView view;
view.setEditTriggers(QAbstractItemView::NoEditTriggers); 
view.header()->setResizeMode(QHeaderView::ResizeToContents);
view.resize(300,280);
    view.iterateOverItems();
view.setWindowTitle(QObject::tr("Linux 服务管理"));
view.show();
return app.exec();

}

显示:

QTreeView - 春天 - 若能一切随他去,便是人间自在人

以上就是TreeView的两种Model了 O(∩_∩)O~



Qt做文件浏览器项目要求做一个文件浏览器,要求文件以列表形式显示,当单击某个目录时,就会进入下层目录,用Qt实现。

方法1:用QFileSystemModel或是QDir做model,QTableView做为显示的view。

采取这种方法的好处是:QFileSystemModel和QDir能自动的读取出当前目录下的文件信息。包括文件的大小,类型等,只要做如下设置就可以将当前目录下的文件列表显示出来。

p_mTVFileList->setRootIndex(dirmodel->setRootPath(filename));  //QTableView设置当前的根目录

要查看view中某个文件或文件夹的信息的时候,只需要知道这个文件所处的index,如下

dirmodell->fileInfo(p_mTVFileList->currentIndex()); //查看当前文件的文件信息

但是QFileSystemModel和QDir里的显示都是英文的。可以通过重写QFileSystemModel的headerdata将表头变成中文,但是里面显示的文件信息的中文信息还不知道怎样变成中文。

方法二:用QListWidget与QDir的entryInfoList实现。entryInfoList的功能比较强大。可以筛选性的读出目录下的文件信息

这种方法的实现原理是,用entryInfoList读出文件列表。将文件列表里的内容作为QListWidgetItem一项项的显示在QListWidget上,并记住当前的目录,当点击list的某一项时,通过item->text()获取文件名,从而又通过entryInfoList进入下一级目录,用这种方法只能显示一列

方法三:用QStandardItemModel与QTableView实现,用QDir的entryInfoList获取文件信息,将获取到数据一步步的填到model中进行显示。

当点击某项之后,通过index.sibling(index.row(),0).data().toString()获取这一行某列的数据,得到文件名

方法四:用Dir的entryInfoList遍历整个的文件夹,将遍历到的结果放在一个QList里面,QList里放的是文件的一些信息,如下

 
 
  1. typedef struct DirNode  
  2. {  
  3.  char filename[200];  
  4.  bool isDir;  
  5.  long parent;  
  6.  long child;  
  7.  long next;  
  8. }DirNode, *PDirNode; 

将各个文件文件夹用地址串起来,成一个链表

各个的代码如下:

/Files/chenxuelian/用链表实现的filenode.rar

/Files/chenxuelian/QFileSystemModel实现的fileview.rar

/Files/chenxuelian/普通model和tableview的fileview.rar

/Files/chenxuelian/QListWidget实现的fileview.rar


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值