如何在QTableView中增加QCheckBox

常用方法有:
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 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();
}

你可能感兴趣的:(QT,C++,QTableView)