转自:http://mobile.51cto.com/symbian-268700.htm
本文讲解了QT中树控件QTreeView开发实例,对于QTreeView没有过多的讲解,那么不说废话了,看代码是如何实现的吧。
方法一:使用QDirModel进行目录的现实,QDirModel是QT中专为文件目录树型显示所提供的一种model。具体使用如下:
1 int main(int argc, char *argv[]) 2 { 3 QApplication app(argc, argv); 4 QSplitter *splitter = new QSplitter; 5 QDirModel *model = new QDirModel; 6 //从缺省目录创建数据 7 QTreeView *tree = new QTreeView(splitter); 8 tree->setModel(model); 9 tree->setRootIndex(model->index("c:\\")); 10 //配置一个view去显示model中的数据,只需要简单地调用setModel(),并把目录model作为参数传递 11 //setRootIndex()告诉views显示哪个目录的信息,这需要提供一个model index,然后用这个 12 //model index去model中去获取数据 13 //index()这个函数是QDirModel特有的,通过把一个目录做为参数,得到了需要的model index 14 //其他的代码只是窗口show出来,进入程序的事件循环就好了 15 QTextCodec::setCodecForTr(QTextCodec::codecForName("GBK")); //中文显示 16 QTextCodec *codec = QTextCodec::codecForLocale(); 17 QString a = codec->toUnicode("目录"); 18 splitter->setWindowTitle(a); 19 splitter->show(); 20 return app.exec(); 21 }
显示结果如下所示:
方法二:自行设置树型结构。
"Treeview.h"文件
1 #include <QtGui> 2 class TreeView :public QTreeView 3 { 4 public: 5 TreeView(); 6 void iterateOverItems(); 7 QList<QStandardItem*> returnTheItems(); 8 void mouseDoubleClickEvent(QMouseEvent *event); 9 private: 10 QStandardItemModel *model; 11 };
"Treeview.cpp"文件
1 #include "treeview.h" 2 3 TreeView::TreeView() : QTreeView() 4 { 5 QTextCodec::setCodecForTr(QTextCodec::codecForName("GBK")); 6 model = new QStandardItemModel(4,2); 7 model->setHeaderData(0, Qt::Horizontal, tr("Service")); 8 model->setHeaderData(1, Qt::Horizontal, tr("Details")); 9 QStandardItem *item1 = new QStandardItem("avahi-daemon"); 10 item1->setIcon(QIcon("gparted.png")); 11 QStandardItem *item2 = new QStandardItem("bluetooth"); 12 item2->setIcon(QIcon("gparted.png")); 13 QStandardItem *item3 = new QStandardItem("crond"); 14 item3->setIcon(QIcon("gparted.png")); 15 QStandardItem *item4 = new QStandardItem("cups"); 16 item4->setIcon(QIcon("gparted.png")); 17 model->setItem(0, 0, item1); 18 model->setItem(1, 0, item2); 19 model->setItem(2, 0, item3); 20 model->setItem(3, 0, item4); 21 QStandardItem *item5 = new QStandardItem("fifth"); 22 item4->appendRow(item5); 23 QModelIndex parent; 24 for (int i = 0; i < 4; ++i) { 25 parent = model->index(0, 0, parent); 26 model->insertRows(0, 1, parent); 27 model->insertColumns(0, 1, parent); 28 QModelIndex index = model->index(0, 0, parent); 29 model->setData(index, i); 30 } 31 this->setModel(model); 32 } 33 34 QList<QStandardItem*> TreeView::returnTheItems() 35 { 36 return model->findItems("*", Qt::MatchWildcard | Qt::MatchRecursive); 37 } 38 39 void TreeView::iterateOverItems() 40 { 41 QList<QStandardItem*> list = returnTheItems(); 42 43 foreach (QStandardItem* item, list) { 44 qDebug() << item->text(); 45 } 46 } 47 48 void TreeView::mouseDoubleClickEvent(QMouseEvent *event) 49 { 50 if (event->button() == Qt::LeftButton) { 51 QModelIndex index0 = currentIndex(); 52 qDebug() << index0.data().toString(); 53 } 54 }
"Main.cpp"文件
1 #include <QtGui/QApplication> 2 #include "treeview.h" 3 4 int main(int argc, char *argv[]) 5 { 6 QApplication app(argc, argv); 7 TreeView view; 8 view.setEditTriggers(QAbstractItemView::NoEditTriggers); 9 view.header()->setResizeMode(QHeaderView::ResizeToContents); 10 view.resize(300,280); 11 view.iterateOverItems(); 12 view.setWindowTitle(QObject::tr("Linux 服务管理")); 13 view.show(); 14 return app.exec(); 15 }
显示:
以上就是TreeView的两种Model了。
小结:本文简单的介绍了QT树控件QTreeView ,通过一个简单的实例来实现QTreeView 的价值。Qt 4推出了一组新的item view类,它们使用model/view结构来管理数据与表示层的关系。这种结构带来的功能上的分离给了开发人员更大的弹性来定制数据项的表示,它也提供一个标准的model接口,使得更多的数据源可以被这些item view使用。