加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

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

(2012-04-16 23:11:05)
标签:

杂谈

分类: 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;
}

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有