QTableView使用示例-Qt模型视图代理(Model-View-Delegate)使用示例
立即下载
资源介绍:
本实例基于QT的委托代理机制实现的Qt模型视图代理(Model-View-Delegate)使用示例。以QTableView为基础,实现表头排序,列表复选框,插入按钮、下拉框、进度条。
模型视图委托(MVD)是Qt中特有的设计模式,类似MVC设计模式,将MVC设计模式中的Controller当做MVD中的Delegate,两者的概念基本相同。不同的是委托不是独立存在,而是包含在视图里面。
模型视图委托设计模式中,模型负责存储和管理数据;视图负责显示数据,其中界面的框架和基础信息是视图负责,具体数据的显示是委托负责;委托不仅仅负责数据的显示,还有一个重要的功能是负责数据的编辑,如在视图中双击就可以编辑数据。
#include "studenttablemodel.h"
#include "student.h"
enum Property { ID, NAME, AGE, GENDER, ACHIEVEMENT, MENUBUTTON, PROCESS };
QVariant StuedentTableModel::data(const QModelIndex &index, int role) const
{
if (!index.isValid())
return false;
int row = index.row();
int col = index.column();
Student *stu = m_students.at(row);
switch (role) {
case Qt::TextAlignmentRole: return Qt::AlignCenter;
case Qt::CheckStateRole:
switch (col) {
case ID: return stu->checked;
default: break;
}
break;
case Qt::DisplayRole:
case Qt::EditRole: { //双击为空需添加
switch (col) {
case ID: return stu->id;
case NAME: return stu->name;
case AGE: return stu->age;
case GENDER: return stu->gender;
case ACHIEVEMENT: return stu->achievement;
case MENUBUTTON: return tr("Detail");
case PROCESS: return stu->process;
default: break;
}
case Qt::UserRole: {
switch (col) {
case MENUBUTTON: return QVariant::fromValue(stu);
default: break;
}
}
}
default: break;
}
return QVariant();
}
bool StuedentTableModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
if (!index.isValid())
return false;
int row = index.row();
int col = index.column();
Student *stu = m_students[row];
switch (role) {
case Qt::CheckStateRole:
switch (col) {
case ID:
stu->checked = !stu->checked;
emit dataChanged(index, index);
return true;
default: break;
}
break;
case Qt::EditRole:
switch (col) {
case ID: stu->id = value.toUInt(); break;
case NAME: stu->name = value.toString(); break;
case AGE: stu->age = value.toUInt(); break;
case GENDER: stu->gender = value.toString(); break;
case ACHIEVEMENT: stu->achievement = value.toUInt(); break;
case PROCESS: stu->process = value.toUInt(); break;
}
emit dataChanged(index, index);
return true;
default: break;
}
return false;
}
QVariant StuedentTableModel::headerData(int section, Qt::Orientation orientation, int role) const
{
const QStringList names = {tr("ID"),
tr("姓名"),
tr("年龄"),
tr("性别"),
tr("成绩"),
tr("详情"),
tr("进度")};
if (section < 0 || section >= names.size())
return QVariant();
if (orientation == Qt::Horizontal && role == Qt::DisplayRole)
return names.at(section);
return QVariant();
}
Qt::ItemFlags StuedentTableModel::flags(const QModelIndex &index) const
{
Qt::ItemFlags flags = QAbstractTableModel::flags(index);
flags |= Qt::ItemIsEditable;
if (index.column() == ID)
flags |= Qt::ItemIsUserCheckable;
return flags;
}
void StuedentTableModel::setStudents(const QList &students)
{
beginResetModel(); //重置数据之前调用,会自动触发 modelAboutToBeReset 信号
m_students = students;
endResetModel(); //重置数据完成后调用,会自动触发 modelReset 信号
}