qt QSqlTableModel在tableview显示checkbox添加复选框

参考了几篇大佬的博客
QMap用法:
QT QMap介绍与使用.
tableview显示checkbox添加复选框:
sql QtableView中添加复选框.
Qt 之 QTableView 添加复选框(QAbstractTableModel).

.h文件

#ifndef QSQLBUGMODEL_H
#define QSQLBUGMODEL_H

#include <QSqlTableModel>
class QSqlBugModel : public QSqlTableModel
{
    
    
    Q_OBJECT
public:
    QSqlBugModel(QObject * parent = nullptr, QSqlDatabase db = QSqlDatabase());

    bool setData( const QModelIndex &index, const QVariant &value, int role );
    QVariant data(const QModelIndex &index, int role) const;
    Qt::ItemFlags flags(const QModelIndex &index) const;
private:

};

#endif // QSQLBUGMODEL_H
#include "qsqlbugmodel.h"
#include <QDebug>
#include <QSqlRecord>
#include <QColor>
#include <QMap>
static QMap<int, Qt::CheckState> check_state_map;
static int checkColumn = 4;//第几列为复选框,从0开始计算

QSqlBugModel::QSqlBugModel(QObject * parent, QSqlDatabase db )
{
    
    

}

bool QSqlBugModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
    
    
    if(!index.isValid())
        return false;

    if (role == Qt::CheckStateRole && index.column() == checkColumn)
    {
    
    
        check_state_map[index.row()] = (value == Qt::Checked ? Qt::Checked : Qt::Unchecked);

        return true;
    }
    else
        return QSqlTableModel::setData(index, value,role);
}
//初始化的时候会进入此处给复选框设置是否勾选
QVariant QSqlBugModel::data(const QModelIndex &index, int role) const
{
    
    
    if (!index.isValid())
        return QVariant();

    if (index.column() != checkColumn )
    {
    
    
        return QSqlTableModel::data(index, role);
    }

    Qt::CheckState findCheck = Qt::Unchecked;
    QString test = QSqlTableModel::data(index, role).toString();
	//在QSqlTableModel得到数据,保存在QMap中
    if( !test.isEmpty() )
    {
    
    
        if(test.toInt())
        {
    
    
            findCheck = Qt::Checked;
        }
        else
        {
    
    
            findCheck = Qt::Unchecked;
        }
        check_state_map.insert(index.row(), findCheck);
    }


    switch(role)
    {
    
    
    case Qt::TextColorRole:
        return QColor(Qt::red);
    case Qt::TextAlignmentRole:
        return QVariant(Qt::AlignLeft | Qt::AlignVCenter);
    case Qt::CheckStateRole:
        if(index.column() == checkColumn)
        {
    
    
            if (check_state_map.contains(index.row()))
            {
    
    //判断是否为QMap保存的key,是的话将数据做判断
                return check_state_map[index.row()] == Qt::Checked ? Qt::Checked : Qt::Unchecked;
            }
            return findCheck;
        }
    }
    return QVariant();
}

Qt::ItemFlags QSqlBugModel::flags(const QModelIndex &index) const
{
    
    
    if (!index.isValid())
        return 0;
    if (index.column() == checkColumn)
        return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsUserCheckable;
    else
        return QSqlTableModel::flags(index);
    return  Qt::ItemIsEnabled | Qt::ItemIsSelectable;
}

头疼了几天的问题解决方法原来就在眼前,可是自己没有仔细看。
新手上路,如有错误,请指出,谢谢。

猜你喜欢

转载自blog.csdn.net/weixin_43387612/article/details/104182958