前面讲解的都是tableView,其实listView和treeView都是一样的,只需要把前面的view换成listView和treeView即可实现列表和树的显示,不必更改mode,只不过上面的mdoe本身没有任何层次结构,所构成的树也没有结构。
本章我们使用标准mode实现树的结构!
我们要使用的mode是QStandardItemModel,他是Qt继承QAbstractItemModel已经实现了的。他需要QStandardItems来充填数据,QStandardItems能保存文本、字体、复选框、画笔等所有的标准属性。
代码结构目录如下图:
mainwindow.h
#include <QtWidgets/QMainWindow>
QT_BEGIN_NAMESPACE // QT_BEGIN_NAMESPACE / QT_END_NAMESPACE are not needed in Qt user code
class QTreeView; //forward declarations
class QStandardItemModel;
class QStandardItem;
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
private:
QTreeView *treeView;
QStandardItemModel *standardModel;
QList<QStandardItem *> prepareRow( const QString &first,
const QString &second,
const QString &third );
public:
MainWindow(QWidget *parent = 0);
};
定义一个QTreeView,一个QStandardItemMode,定义一个prepareRow()函数构造QStandardItem类型的数组存储在QList中。
mainwindow.cpp
#include <QTreeView>
#include <QStandardItemModel>
#include <QStandardItem>
#include "mainwindow.h"
const int ROWS = 2;
const int COLUMNS = 3;
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
treeView = new QTreeView(this);
setCentralWidget(treeView);
standardModel = new QStandardItemModel ;
QList<QStandardItem *> preparedRow =prepareRow("first", "second", "third");
QStandardItem *item = standardModel->invisibleRootItem();
// adding a row to the invisible root item produces a root element
item->appendRow(preparedRow);
QList<QStandardItem *> secondRow =prepareRow("111", "222", "333");
// adding a row to an item starts a subtree
preparedRow.first()->appendRow(secondRow);
treeView->setModel(standardModel);
treeView->expandAll();
}
QList<QStandardItem *> MainWindow::prepareRow(const QString &first,
const QString &second,
const QString &third)
{
QList<QStandardItem *> rowItems;
rowItems << new QStandardItem(first);
rowItems << new QStandardItem(second);
rowItems << new QStandardItem(third);
return rowItems;
}
//! [Quoting ModelView Tutorial]
首先用prepareRow()函数生成QList,调用invisibleRootItem()找到根节点,用appendRow()在根节点下添加子节点;
再次调用prepareRow()生成数据,在第一个节点下新增节点,即具有了树结构。expandAll()函数的作用是展开所有节点。
运行效果如下: