原文地址:http://mobile.51cto.com/symbian-268700.htm
注:这里做了些许改动,内容等方面并无影响。
本文讲解了QT中树控件QTreeView开发实例,对于QTreeView没有过多的讲解,那么不说废话了,看代码是如何实现的吧。
方法一:使用QDirModel进行目录的现实,QDirModel是QT中专为文件目录树型显示所提供的一种model。 具体使用如下:
#include <QApplication>
#include <QTextCodec>
#include <QSplitter>
#include <QDirModel>
#include <QTreeView>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("System"));
QSplitter *splitter = new QSplitter;
QDirModel *model = new QDirModel;
// 从缺省目录创建数据
/* 配置一个view去显示model中的数据,只需要简单地调用setModel(),并把目录model作为参数传递
setRootIndex()告诉views显示哪个目录的信息,这需要提供一个model index,然后用这个index去model中获取数据
index()这个函数是QDirModel特有的,通过把一个目录作为参数,得到了需要的model index
其他的代码只是窗口show出来,然后进入程序的事件循环*/
QTreeView *tree = new QTreeView(splitter);
tree->setModel(model);
tree->setRootIndex(model->index("C:\\"));
splitter->setWindowTitle("目录");
splitter->setGeometry(100,100,450,200);
splitter->show();
return a.exec();
}
显示结果如下所示:
方法二:自行设置树型结构。
treeview.h
#ifndef TREEVIEW_H
#define TREEVIEW_H
#include <QTreeView>
#include <QList>
#include <QStandardItem>
#include <QMouseEvent>
class TreeView : public QTreeView
{
Q_OBJECT
public:
explicit TreeView(QWidget *parent = 0);
void iteratorOverItems();
QList<QStandardItem *> returnTheItems();
void mouseDoubleClickEvent(QMouseEvent *event);
signals:
public slots:
private:
QStandardItemModel *model;
};
#endif // TREEVIEW_H
treeview.cpp
#include "treeview.h"
#include <QModelIndex>
#include <QDebug>
TreeView::TreeView(QWidget *parent) :
QTreeView(parent)
{
model = new QStandardItemModel(4, 2);
model->setHeaderData(0, Qt::Horizontal, "Service");
model->setHeaderData(1, Qt::Horizontal, "Details");
QStandardItem *item1 = new QStandardItem("avahi-daemon");
item1->setIcon(QIcon(":/btn_bright_01"));
QStandardItem *item2 = new QStandardItem("bluetooth");
item2->setIcon(QIcon(":/btn_bright_02"));
QStandardItem *item3 = new QStandardItem("crond");
item3->setIcon(QIcon(":/btn_bright_03"));
QStandardItem *item4 = new QStandardItem("cups");
item4->setIcon(QIcon(":/btn_bright_04"));
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 myparent;
for (int i=0; i<4; i++)
{
myparent = model->index(0, 0, myparent);
model->insertRows(0, 1, myparent); // 添加一行
model->insertColumns(0, 1, myparent); // 添加一列
QModelIndex index = model->index(0, 0, myparent);
model->setData(index, i);
}
this->setModel(model);
}
// 输出所有单元格的内容
void TreeView::iteratorOverItems()
{
QList<QStandardItem *> list = this->returnTheItems();
foreach (QStandardItem *item, list)
{
qDebug()<<item->text();
}
}
// 获取所有单元格
QList<QStandardItem *> TreeView::returnTheItems()
{
return model->findItems("*", Qt::MatchWildcard | Qt::MatchRecursive);
}
// 鼠标双击事件(输出被双击item的文本)
void TreeView::mouseDoubleClickEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton)
{
QModelIndex index = currentIndex();
qDebug()<<index.data().toString();
}
}
main.cpp
#include <QApplication>
#include "treeview.h"
#include <QAbstractItemView>
#include <QHeaderView>
#include <QTextCodec>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("System"));
TreeView view;
view.setEditTriggers(QAbstractItemView::NoEditTriggers);
view.header()->setResizeMode(QHeaderView::ResizeToContents);
view.resize(300,280);
view.iteratorOverItems();
view.setWindowTitle("Linux 服务管理");
view.show();
return a.exec();
}
显示: