Qt mode/view全解六

前面讲解的都是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()函数的作用是展开所有节点。

运行效果如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值