目录
一、前言
本例主要讲解QAbstractTableModel用来制作表格的方法。
如果想在表格中添加控件,请查看我的博客《QItemDelegate表格添加控件简单解析》
二、效果展示
三、源码解析
CModel.h
#ifndef CMODEL_H
#define CMODEL_H
#include <QAbstractTableModel>
#include <QStringList>
#include <QVector>
class CModel : public QAbstractTableModel
{
Q_OBJECT
public:
explicit CModel();
~CModel();
//行数
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 bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole);
//显示行首
virtual QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const;
//设置表格可选性等
virtual Qt::ItemFlags flags(const QModelIndex &index) const;
private:
//行首值
QStringList m_horHeard;
//表格数据
QVector<QStringList> m_vecData;
};
#endif // CMODEL_H
CModel.cpp
#include "CModel.h"
#include <QCoreApplication>
#include <QDebug>
#include <QTextCodec>
CModel::CModel()
{
//设置行首值
m_horHeard << tr("Name")
<< tr("Class")
<< tr("Grade");
//设置虚拟数据值
QStringList strlist1;
strlist1 << "Xiao Ming"
<< "Class A"
<< "96";
QStringList strlist2;
strlist2 << "Xiao Fang"
<< "Class A"
<< "97";
QStringList strlist3;
strlist3 << "Xiao Liu"
<< "Class B"
<< "98";
QStringList strlist4;
strlist4 << "Xiao Yao"
<< "Class B"
<< "99";
m_vecData.push_back(strlist1);
m_vecData.push_back(strlist2);
m_vecData.push_back(strlist3);
m_vecData.push_back(strlist4);
}
CModel::~CModel()
{
}
int CModel::rowCount(const QModelIndex &parent) const
{
return m_vecData.count();
}
int CModel::columnCount(const QModelIndex &parent) const
{
return m_horHeard.count();
}
QVariant CModel::data(const QModelIndex &index, int role) const
{
if (!index.isValid())
{
return QVariant();
}
if (role == Qt::DisplayRole || role == Qt::EditRole)
{
//行
int iRow = index.row();
//列
int iColumn = index.column();
switch (iColumn)
{
case 0:
return m_vecData.at(iRow).at(iColumn);
break;
case 1:
return m_vecData.at(iRow).at(iColumn);
break;
case 2:
return m_vecData.at(iRow).at(iColumn);
break;
default:
break;
}
}
else if (role == Qt::TextAlignmentRole)
{
return Qt::AlignCenter;
}
return QVariant();
}
//这里界面修改, 数据变动的地方
bool CModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
if (!index.isValid())
return false;
if (role == Qt::DisplayRole ||role == Qt::EditRole)
{
int iRow = index.row();
int iColumn = index.column();
QStringList strList = m_vecData.at(iRow);
switch (iColumn)
{
case 0:
strList.replace(iColumn, value.toString());
m_vecData.replace(iRow, strList);
break;
case 1:
strList.replace(iColumn, value.toString());
m_vecData.replace(iRow, strList);
break;
case 2:
strList.replace(iColumn, value.toString());
m_vecData.replace(iRow, strList);
break;
default:
break;
}
//reset函数可以立即刷新表格数据
reset();
return true;
}
return false;
}
QVariant CModel::headerData(int section, Qt::Orientation orientation, int role) const
{
if (orientation == Qt::Horizontal && role == Qt::DisplayRole)
{
return m_horHeard.at(section);
}
return QVariant();
}
Qt::ItemFlags CModel::flags(const QModelIndex &index) const
{
Qt::ItemFlags flag = QAbstractTableModel::flags(index);
if (index.column() >= 0)
{
flag |= Qt::ItemIsEditable;
}
return flag;
}
四、Demo/相关包
另附Demo供大家参考(百度云盘):
链接: https://pan.baidu.com/s/1vgD-n26UnOU-FcxwCOYNeg 提取码: 7sv5