背景
Qt 模型视图编程中模型定义了标准接口对数据进行访问,可根据需求继承对应的抽象模型类来实现自定义的数据模型。一个基本的数据模型至少要实现以下虚函数:
①.rowCount:行数,返回要显示多少行;
②.columnCount:列数,返回要显示多少列
③.data:读取数据,返回每个单元格要显示的内容
视图不会主动更新数据的显示,模型使用 dataChanged 信号通知视图数据发生变化。
模型数据重置
①.概述
通常在应用程序中用户数据不是一成不变的,经常需要对界面中的数据进行重新加载并刷新数据显示。在Qt 模型视图编程中可以对模型中的数据进行重置。
②.关键方法
beginResetModel:继承自基类 QAbstractItemModel 中的方法,在重置数据之前调用,会自动触发 modelAboutToBeReset 信号;
endResetModel:继承自基类 QAbstractItemModel 中的方法,在重置数据完成后调用,会自动触发 modelReset 信号。
重置模型数据
①.TableModelDemo.h 文件
在自定义模型中增加数据重置方法
#include <QAbstractTableModel>
struct student
{
QString name;
int age;
QString sex;
};//测试用数据结构
Q_DECLARE_METATYPE(student)
class TableModelDemo : public QAbstractTableModel
{
Q_OBJECT
public:
TableModelDemo(QList<student> & list, QObject *parent = nullptr):QAbstractTableModel(parent),m_list(list){};
~TableModelDemo() {};
public:
int rowCount(const QModelIndex &parent) const override;//
int columnCount(const QModelIndex &parent) const override;//
QVariant data(const QModelIndex &index,int role) const override;//
Qt::ItemFlags flags(const QModelIndex &index)const override;//
bool setData(const QModelIndex &index,const QVariant & value, int role = Qt::EditRole) override;//
private:
QList<student> &m_list;//对内存中数据的引用
public:
void setCustomData(QList<student> & l);//数据重置
};
②.TableModelDemo.cpp 文件
void TableModelDemo::setCustomData(QList<student> & l)
{
beginResetModel();//数据重置前调用
m_list = l;//重置数据
endResetModel();//数据重置后调用
}
③.数据模型初始化
QList<student> m_list;//全局数据
student s;
s.age = 18;
s.name = "张三";
s.sex = "男";
m_list.append(s);
s.age = 16;
s.name = "李四";
s.sex = "女";
m_list.append(s);
auto mode = new TableModelDemo(m_list);
ui.tableView->setModel(mode);
④.重置模型数据
connect(ui.pushButton, &QPushButton::clicked, [mode]() {
student s;
s.age = 27;
s.name = "王五";
s.sex = "男";
m_list.append(s);
mode->setCustomData(m_list);//重置数据
});
使用数据更新重置数据
①.概述
当模型数据重置后行数和列数没有发生变化时,也可以通过发送数据更新信号实现重置数据。
②.使用数据更新重置数据
void TableModelDemo::setCustomData(QList<student> & l)
{
int m_rowCount = rowCount(QModelIndex());//行数
int m_colCount = columnCount(QModelIndex());//列数
m_list = l;//重置数据
emit dataChanged(index(0, 0), index(m_rowCount - 1, m_rowCount - 1));
}
③.重置模型数据
connect(ui.pushButton, &QPushButton::clicked, [mode]() {
m_list[1].name = "王五";
mode->setCustomData(m_list);
});