常用方法有:
1、通过QAbstractItemDelegate类添加,在createEditor()函数中new 一个QCheckBox,塞到QTableView中;
2、直接使用QTableView的Model里开关实现。
(1)重写Qt::ItemFlags flags(const QModelIndex &index) const函数;
(2)改写QVariant data(const QModelIndex &index, int role) const override函数。
(3)重写bool QTestModel::setData(const QModelIndex &index, const QVariant &value, int role)函数;
本文介绍第二种方法。QTableView本来就存在QCheckBox,默认隐藏,通过代码把它重新打开即可。适用于使用MVC方法的QTableView。
假设三个类分别为QTest,QTestView,QTestModel。
(1)QTestModel类中重写flags ,setData和data函数。
QTestModel.h中函数声明:
public:
Qt::ItemFlags flags(const QModelIndex &index) const;
QVariant data(const QModelIndex &index, int role) const override;
bool QTestModel::setData(const QModelIndex &index, const QVariant &value, int role);
private:
QMap<int, Qt::CheckState> m_rowCheckStateMap;
QTestModel.cpp中函数定义:
Qt::ItemFlags QTestModel::flags(const QModelIndex &index) const
{
if (!index.isValid())
return QAbstractItemModel::flags(index);
int col = index.column();
int row = index.row();
switch (col)
{
case col_BreakPoint:
return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsUserCheckable;
default:
break;
}
return Qt::ItemIsEnabled | Qt::ItemIsSelectable;
}
bool QTestModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
if (!index.isValid())
return false;
if (role == Qt::CheckStateRole && index.column() == col_BreakPoint)
{
if (value == Qt::Checked) //
{
m_rowCheckStateMap[index.row()] = Qt::Checked;
}
else
{
m_rowCheckStateMap[index.row()] = Qt::Unchecked;
}
}
return true;
}
QVariant QTestModel::data(const QModelIndex &index, int role) const
{
if (!index.isValid())
{
return QVariant();
}
int row = index.row();
int colum = index.column();
if (row < 0 || row >= m_valList.size())
{
return QVariant();
}
switch (role)
{
case Qt::DecorationRole:
{
break;
}
case Qt::TextColorRole:
{
break;
}
case Qt::ToolTipRole:
{
break;
}
case Qt::DisplayRole:
{
return showVal(row, colum, m_valList, role);
break;
}
case Qt::TextAlignmentRole:
return QVariant(Qt::AlignVCenter);
//关键--------------------------------------------------------------
case Qt::CheckStateRole:
{
if (colum == 0)//在第0列显示QCheckBox
{
return m_rowCheckStateMap[index.row()] == Qt::Checked ? Qt::Checked : Qt::Unchecked;
}
return Qt::Unchecked;
}
break;
}
//--------------------------------------------------------------
default:
return QVariant();
break;
}
return QVariant();
}