有如下代码
cpp
#include "mymodel.h"
#include <QDebug>
myModel::myModel(QObject *parent) : QAbstractTableModel(parent)
{
status << Qt::Unchecked << Qt::Unchecked << Qt::Unchecked;
}
int myModel::rowCount(const QModelIndex &parent)const
{
Q_UNUSED(parent);
return 3;
}
int myModel::columnCount(const QModelIndex &parent)const
{
Q_UNUSED(parent);
return 2;
}
void myModel::setHeader(const QStringList &list)
{
m_header = list;
}
QVariant myModel::headerData(int section, Qt::Orientation orientation, int role) const
{
if(role == Qt::DisplayRole)
{
if(orientation == Qt::Horizontal)
{
return m_header.at(section);
}
}
return QVariant();
}
QVariant myModel::data(const QModelIndex &index, int role)const
{
if(role == Qt::DisplayRole)
{
if(index.column() == 0)
{
return QStringLiteral("%1号同学").arg(index.row() + 1);
}
if(index.column() == 1)
{
return QStringLiteral("1000%1").arg(index.row() + 1);
}
}
if(role == Qt::CheckStateRole)
{
if(index.column() == 0)
{
return status.at(index.row());
}
return QVariant();
}
return QVariant();
}
Qt::ItemFlags myModel::flags(const QModelIndex &index) const
{
if(!index.isValid())
{
return QAbstractItemModel::flags(index);
}
Qt::ItemFlags flags = QAbstractItemModel::flags(index);
if(index.column() == 0)
{
flags |= Qt::ItemIsUserCheckable;
}
return flags;
}
bool myModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
if(!index.isValid())
{
return false;
}
if(role == Qt::CheckStateRole)
{
if(index.column() == 0)
{
status[index.row()] = value.toInt();
emit dataChanged(index, index);
return true;
}
}
return false;
}
效果如下
额,效果不是很明显。但是当我快速点击鼠标左键时,发现checkbox的状态并没有立即修改,这是因为快速点击鼠标左键时,被识别成了双击事件,修改思路如下,创建一个类继承于QStyledItemDelegate
,然后重写 bool QStyledItemDelegate::editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index)
这个方法,当遇到 双击事件时,单独处理即可。代码如下
cpp
#include "MyStyledItemDelegate.h"
#include <QEvent>
MyStyledItemDelegate::MyStyledItemDelegate(QObject *parent) : QStyledItemDelegate(parent)
{
}
bool MyStyledItemDelegate::editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index)
{
if(event->type() == QEvent::MouseButtonDblClick && index.column() == 0){
model->setData(index, index.data(Qt::CheckStateRole).toInt() == Qt::Checked ? Qt::Unchecked : Qt::Checked ,Qt::CheckStateRole);
return true;
}else{
return QStyledItemDelegate::editorEvent(event, model, option, index);
}
}
修正后效果如图