Qt Model/View理解(二)---构造model

数据是一个集合,显示也是一个集合。例如一篇《西游记》的文章,所有的文字就是数据集合,展示方式就是显示的集合,可以以书本的形式,也可以以电纸书的形式,更可以用视频的方式展现。

下面是将一个二维数组中的数据显示到TableView控件中。

1.声明一个model类,继承于QAbstractTableModel

#define ROW  3
#define COL  2

class TableModel : public QAbstractTableModel
{
    Q_OBJECT
public:
    TableModel(QObject *parent = 0);
    ~TableModel();
    //QAbstractTableModel 中3个必须重新实现的虚函数
    int	rowCount(const QModelIndex & parent = QModelIndex()) const;
    int	columnCount(const QModelIndex & parent = QModelIndex()) const;
    QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const;

private:
    int num[ROW][COL];
    int nn;
};

2.方法实现

TableModel::TableModel(QObject *parent) :QAbstractTableModel(parent)
{
    //二维数初始化,从100开始
    nn = 100;
    for(int i=0;i<ROW;++i){
        for(int j=0;j<COL;++j){
            num[i][j] = nn;
            ++nn;
        }
    }
}

TableModel::~TableModel()
{
}

//体现model的行数,这里有3行
int	TableModel::rowCount(const QModelIndex & parent) const
{
    return ROW;
}

//体现model的列数,这里有2列
int	TableModel::columnCount(const QModelIndex & parent) const
{
    return COL;
}

//体现model中显示的数据,这里只是num中每一个成员值。
QVariant TableModel::data(const QModelIndex & index, int role) const
{
    if (Qt::DisplayRole == role)
    {
        return num[index.row()][index.column()];//返回num二维数组中的值
    }
    return QVariant::Invalid;
}

3.将model与QTableView关联起来。

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    this->resize(300,200);

    TableModel *model = new TableModel();

    QTableView *tableview = new QTableView(this);

    tableview->setModel(model);

    tableview->setGeometry(5,5,280,180);
}

4.显示效果,3行2列


目前的实现都是从定义好的model中取出数据,放在不同的显示控件中,相当于只读,没有对数据部分做任何修改。下一节将以此篇为基础,介绍如何对数据部分进行操作。



猜你喜欢

转载自blog.csdn.net/lutao614/article/details/80863790