Qt4中的MVC学习之QTableView中嵌入复选框(CheckBox)

标签:
杂谈 |
分类: Qt学习 |
QTableView中嵌入复选框CheckBox方法有多种:
第一种方法是:编辑委托法。
第二种方法是:设置QAbstractTableModel的flags()函数法。
第三种方法是:用QTableView中的方法void
setIndexWidget(const QModelIndex &index, QWidget
*widget)来设置QCheckBox。
第四种方法是:实现QAbstractItemDelegate的paint()函数。
下面介绍第二种方法:设置QAbstractTableModel的flags()函数法。
该方法主要实现的函数包括以下六个,其中有3个函数(红色字体的)与前一篇的有所不同,
int rowCount(const QModelIndex
&parent = QModelIndex()) const; int
columnCount(const QModelIndex &parent =
QModelIndex()) const; QVariant data(const QModelIndex
&index, int role = Qt::DisplayRole) const;
QVariant headerData(int section, Qt::Orientation orientation, int
role = Qt::DisplayRole) const; Qt::ItemFlags flags(const QModelIndex
&index) const; bool setData(const QModelIndex
&index, const QVariant &value, int
role);
下面是基于上一篇文章《Qt4中的MVC学习之QTableView数据显示》,然后再在QTableView中嵌入CheckBox。
1.效果如下图所示:
2.在StudentInfoModel
.h头文件中的主要代码:
class
StudentInfoModel : public
QAbstractTableModel
{
Q_OBJECT
public:
StudentInfoModel(const int totalColumn, const int
aColumnNumWithChechBox = 0, QObject *parent = 0)
:totalColumn(totalColumn),colNumberWithCheckBox(aColumnNumWithChechBox),
QAbstractTableModel(parent)
{rowCheckStateMap.clear();};
public:
int rowCount(const
QModelIndex &parent = QModelIndex())
const;
int columnCount(const QModelIndex &parent
= QModelIndex()) const;
QVariant data(const
QModelIndex &index, int role = Qt::DisplayRole)
const;
QVariant
headerData(int section, Qt::Orientation orientation, int role =
Qt::DisplayRole) const;
Qt::ItemFlags
flags(const QModelIndex &index) const;
bool setData(const QModelIndex
&index, const QVariant &value, int
role);
public:
void
AddStudentInfo(const StudentInfo
&studentInfo);
signals:
void
StudentInfoIsChecked(const StudentInfo
&studentInfo);
private:
typedef
QVector<StudentInfo>
StudentInfos;
StudentInfos
studentInfos;
int
totalColumn;
int
colNumberWithCheckBox;
QMap<int, Qt::CheckState>
rowCheckStateMap;
};
3.在StudentInfoModel.cpp文件中的主要代码如下:
QVariant
StudentInfoModel::data( const QModelIndex &index,
int role ) const
{
if (role ==
Qt::DisplayRole) { if (index.column() == 0) return
QString::number(index.row()+1); if (index.column() == 1) return
studentInfos[index.row()].stuNumber; if (index.column() == 2)
return studentInfos[index.row()].stuName; if (index.column() == 3)
return studentInfos[index.row()].stuID; if (index.column() == 4)
return studentInfos[index.row()].stuPhoneNumber; if (index.column()
== 5) return studentInfos[index.row()].department; if
(index.column() == 6) return
studentInfos[index.row()].stuDescription; } if (role == Qt::CheckStateRole) { if
(index.column() == colNumberWithCheckBox) { if
(rowCheckStateMap.contains(index.row())) return
rowCheckStateMap[index.row()] == Qt::Checked ? Qt::Checked :
Qt::Unchecked; return Qt::Unchecked; } } return
QVariant();
}
Qt::ItemFlags
StudentInfoModel::flags( const QModelIndex &index )
const
{
if
(!index.isValid())
return 0;
if (index.column() ==
colNumberWithCheckBox)
return Qt::ItemIsEnabled |
Qt::ItemIsSelectable | Qt::ItemIsUserCheckable;
return
Qt::ItemIsEnabled | Qt::ItemIsSelectable;
}
bool
StudentInfoModel::setData( const QModelIndex
&index, const QVariant &value, int
role )
{
if
(!index.isValid())
return false;
if (role == Qt::CheckStateRole
&& index.column() ==
colNumberWithCheckBox)
{
if (value == Qt::Checked) //
{
rowCheckStateMap[index.row()]
= Qt::Checked;
if
(studentInfos.size() >
index.row())
emit
StudentInfoIsChecked(studentInfos[index.row()]);
}
else
{
rowCheckStateMap[index.row()] =
Qt::Unchecked;
}
}
return true;
}