Qt系列文章之 QAbstractItemModel(下)

本文紧接着上一文介绍如何对用户模型剩下的类进行实现,并将其集成到视图并显示出来。

QAbstractItemModel

  • insertRows(int row, int count, const QModelIndex &parent)
    该函数实现一次性向表格之中从row位置开始插入count行,一个简单的实现手段是:
{
   
    if(row<0 || row>m_dataVector->size() || count<1) return false;
    beginInsertRows(parent, row, row + count - 1);
    for (quint8 i=0;i<count;i++)
    {
   
        QPair<QString,int> newPair{
   };
        m_dataVector->insert(row+i,newPair);
    }
    endInsertRows();
    return true;
}
  • insertColumns(int column, int count, const QModelIndex &parent)
    由于表格固定是两列,所以此处不做处理。
{
   
    beginInsertColumns(parent, column, column + count - 1);
    endInsertColumns();
    return false;
}
  • removeRows(int row, int count, const QModelIndex &parent)
    删除行与前面的方法类似,此处一个简单实现如下:
{
   
    if(row<0 || row>m_dataVector->size() || count<1 ) return false;
    beginRemoveRows(parent, row, row + count - 1);
    for (quint8 i=0;i<count;i++)
    {
   
        if(m_dataVector->size()==0) return true;  //判断是否已经删除完,如果已完,提前退出
        m_dataVector->remove(row);
    }
    endRemoveRows();
    return true;
}
  • removeColumns(int column, int count, const QModelIndex &parent)
    类似的,此处也不需要对删除列进行操作:
{
   
    beginRemoveColumns(parent, column, column + count - 1);
    // FIXME: Implement me!
    endRemoveColumns();
    return false;
}

下一步构造一个简单的视图,实现对数据的显示。进入main.cpp,对前期的界面显示代码进行注释:

int main(int argc, char *argv[])
{
   
    QApplication a(argc, argv);

//    mainWindow w;
//    w.show();

包含需要的头文件:

#include <QTableView>
#include "customtableview.h"

此处使用标准的QTableView来显示图标,构建一个视图,构建一个用户模型示例并将其设置为视图的模型,最后显示视图。

    QTableView view;         //构造视图
    CustomItemModel model;   //构造模型
    view.setModel(&model);   //设置视图的模型
    view.show();             //显示视图

编译运行代码,显示表格:
在这里插入图片描述

再在用户模型之中加入一个写入数据的槽函数:

void CustomItemModel::pushData(QString &name, int &age)
{
   
    m_dataVector->push_back(QPair<QString,int>(name,age));
    m_checked.push_back(QPair<bool,bool>(false,false));
    emit dataChanged(
        createIndex(m_dataVector->size()-1,0),
        createIndex(m_dataVector->size()-1,1),
        QVector<int>() << Qt::DisplayRole<<Qt::CheckStateRole
                     );
}

调用对象的槽函数,写入几个测试数据:

    model.pushData("Jim",28);
    model.pushData("White",72);

运行模型:
在这里插入图片描述

后面我对数据其他一些角色进行修改,增加一个图标显示,比如Name列显示红色,Age列显示绿色。

    case Qt::DecorationRole://The data to be rendered as a decoration in the form of an icon. (QColor, QIcon or QPixmap)
    {
   
        if(index.column()==0) return QColor(255,0,0,255); //Name显示 红色
        if(index.column()==1) return QColor(0,255,0,255); //Age列显示绿色
    }

运行代码:
在这里插入图片描述

再给每个条目显示一个勾选框:
在这里插入图片描述
为了方便交互,需要一个数据结构来记录勾选状态:

QVector<QPair<bool,bool>> m_checked{
   };  //储存某个位置是否被勾选

根据数据设置条目勾选状态:

    case Qt::CheckStateRole:
    {
   
        if(index.column()==0)
        {
   
            if(m_checked.at(index.row()).first) return Qt::Checked;
            else return  Qt::Unchecked;
        
  • 4
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值