好久没有关注这些细节了,竟然记得不太清楚了,写一个日志记下来,忘了可以查。
class QMyModel : public QStandardItemModel
{
public:
QMyModel(int rows, int columns, QObject * parent = 0)
:QStandardItemModel(rows,columns,parent){}
Qt::ItemFlags flags(const QModelIndex & index) const
{
if(index.column() == 0)
{
return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsUserCheckable;
}
return Qt::ItemIsEnabled | Qt::ItemIsSelectable;
}
QVariant data(const QModelIndex &index, int role) const
{
if (role==Qt::CheckStateRole && index.column()==0) //判断显示的对象是checkbox,并且位于第一列
{
if (m_checkedList.contains(index)) //在m_checkedList中查找,如果有,显示checkbox被选中
return Qt::Checked;
else
return Qt::Unchecked; //如果没有显示checkbox没被选中
}
else
{
return QStandardItemModel::data(index,role);
}
}
bool setData(const QModelIndex &index, const QVariant &value, int role)
{
if (role==Qt::CheckStateRole && index.column()==0)
{
if (value==Qt::Unchecked)
{
m_checkedList.removeOne(index);
emit dataChanged(index, index);
}
else if(value==Qt::Checked)
{
m_checkedList.append(index);
emit dataChanged(index, index);
}
int childCount = rowCount(index);
if (childCount>0) //判断是否有子节点
{
for (int i=0;i<childCount;i++)
{
QModelIndex child = this->index(i, 0, index); //获得子节点的index
setData(child, value, Qt::CheckStateRole); //递归,将子节点的checkbox设为选中状态
}
}
return true;
}
else
{
return QStandardItemModel::setData(index,value,role);
}
}
private:
QList<QPersistentModelIndex> m_checkedList;
};
在这个例子的实现上参照了网上的一个帖子,对子节点也进行了处理。
这个列子中没有处理删除和reload,这时m_checkedList需要更新。