Qt 模型视图编程之重置模型数据

背景

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);    

});

在这里插入图片描述

在这里插入图片描述

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值