1.简介
QAbstractTableModel为将数据表示为二维项数组的模型提供了一个标准接口。它不直接使用,但必须进行子类化。
由于该模型提供了比QAbstractItemModel更专业的接口,因此它不适合与树视图一起使用,尽管它可以用于向QListView提供数据。如果需要表示一个简单的项列表,并且只需要一个模型包含一列数据,那么将QAbstractListModel子类化可能更合适。
继承QAbstractTableModel,需要重写rowCount()、columnCount()、data()和headerData()等函数。
- rowCount()函数返回模型的行数。
- columnCount()函数返回模型的列数。
- data()函数返回指定索引处的数据。
- headerData()函数返回表头的数据,根据orientation参数返回水平或垂直表头的数据。
2.示例
#ifndef MYTABLEMODEL_H
#define MYTABLEMODEL_H
#include <QAbstractTableModel>
#include <QObject>
#include <QList>
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<Student> 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<Student> m_lstStu;
};
#endif // MYMODEL_H
#include "MyTableModel.h"
MyTableModel::MyTableModel(QObject *parent)
: QAbstractTableModel(parent)
{
}
void MyTableModel::update(QList<Student> students)
{
m_lstStu = students;
for(int i=0;i<m_lstStu.size();i++)
{
beginInsertRows(QModelIndex(),i,i);
endInsertRows();
}
}
int MyTableModel::rowCount(const QModelIndex &parent) const
{
Q_UNUSED(parent);
return m_lstStu.count();
}
int MyTableModel::columnCount(const QModelIndex &parent) const
{
Q_UNUSED(parent);
return 3;
}
QVariant MyTableModel::data(const QModelIndex &index, int role) const
{
if (!index.isValid())
return QVariant();
int nColumn = index.column();
int nRow = index.row();
Student stu = m_lstStu.at(nRow);
if(role == Qt::DisplayRole)
{
if (nColumn == MyTableModel::Name)
return stu.name;
else if(nColumn == MyTableModel::Age)
return stu.age;
else if(nColumn == MyTableModel::Score)
return stu.score;
}
return QVariant();
}
QVariant MyTableModel::headerData(int section, Qt::Orientation orientation, int role) const
{
Q_UNUSED(section);
if(orientation == Qt::Horizontal && role == Qt::DisplayRole)
{
if (section == MyTableModel::Name)
return QStringLiteral("姓名");
else if(section == MyTableModel::Age)
return QStringLiteral("年龄");
else if(section == MyTableModel::Score)
return QStringLiteral("分数");
}
return QVariant();
}
使用:
//去除选中虚线框
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<Student> students;
QList<QString> 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);