Qt 继承QAbstractTableModel实现自定义TableModel

1.简介

QAbstractTableModel为将数据表示为二维项数组的模型提供了一个标准接口。它不直接使用,但必须进行子类化。

由于该模型提供了比QAbstractItemModel更专业的接口,因此它不适合与树视图一起使用,尽管它可以用于向QListView提供数据。如果需要表示一个简单的项列表,并且只需要一个模型包含一列数据,那么将QAbstractListModel子类化可能更合适。

Qt 继承QAbstractTableModel实现自定义TableModel_第1张图片

继承QAbstractTableModel,需要重写rowCount()、columnCount()、data()和headerData()等函数。

  • rowCount()函数返回模型的行数。
  • columnCount()函数返回模型的列数。
  • data()函数返回指定索引处的数据。
  • headerData()函数返回表头的数据,根据orientation参数返回水平或垂直表头的数据。

2.示例

做一个自定义的表格。

Qt 继承QAbstractTableModel实现自定义TableModel_第2张图片

声明数据结构体:

typedef struct _student
{
    QString name;
    int age;
    double score;
}Student;

重写rowCount()、columnCount()、data()和headerData()等函数。

void update(QList students);这个是我自定义的方法,用来设置数据。

#ifndef MYTABLEMODEL_H
#define MYTABLEMODEL_H

#include 
#include 
#include 

typedef struct _student
{
    QString name;
    int age;
    double score;
}Student;

class MyTableModel : public QAbstractTableModel
{
    Q_OBJECT
public:
    MyTableModel(QObject *parent = nullptr);


    enum RoleNames{
        Name,
        Age,
        Score
    };

public:
    //更新
    void update(QList students);

    //行数量
    virtual int rowCount(const QModelIndex &parent = QModelIndex()) const;

    //列数量
    virtual int columnCount(const QModelIndex &parent = QModelIndex()) const;

    // 表格项数据
    virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;

    // 表头数据
    virtual QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const;

private:
    QList m_lstStu;
};

#endif // MYMODEL_H


#include "MyTableModel.h"

MyTableModel::MyTableModel(QObject *parent)
    : QAbstractTableModel(parent)
{

}

void MyTableModel::update(QList students)
{
    m_lstStu = students;
    for(int i=0;i

使用示例:

    //去除选中虚线框
    ui->tableView->setFocusPolicy(Qt::NoFocus);

    //设置最后一栏自适应长度
    ui->tableView->horizontalHeader()->setStretchLastSection(true);

    //设置整行选中
    ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows);

    //不显示垂直表头
    ui->tableView->verticalHeader()->setVisible(false);

    MyTableModel *pModel = new MyTableModel(this);

    // 构造数据,更新界面
    QList students;
    QList nameList;
    nameList<<"张三"<<"李四"<<"王二"<<"赵五"<<"刘六";

    for (int i = 0; i < 5; ++i)
    {
        Student student;
        student.name = nameList.at(i);
        student.age = qrand()%6 + 13;//随机生成13到19的随机数
        student.score = qrand()%20 + 80;//随机生成0到100的随机数;

        students.append(student);
    }

    pModel->update(students);
    ui->tableView->setModel(pModel);

3.推荐

Qt 继承QAbstractListModel实现自定义ListModel-CSDN博客

Qt 插件开发详解_qt插件化开发-CSDN博客 

你可能感兴趣的:(Qt进阶,qt,TableModel,model,view)