首页下载资源移动开发QTableView使用示例-Qt模型视图代理(Model-View-Delegate)使用示例

ZIPQTableView使用示例-Qt模型视图代理(Model-View-Delegate)使用示例

u01295947810.72KB需要积分:1

资源文件列表:

TabViewModel.zip 大约有18个文件
  1. TabViewModel/
  2. TabViewModel/buttondelegate.cpp 2.59KB
  3. TabViewModel/buttondelegate.h 636B
  4. TabViewModel/comboboxdelegate.cpp 943B
  5. TabViewModel/comboboxdelegate.h 750B
  6. TabViewModel/main.cpp 194B
  7. TabViewModel/mainwindow.cpp 2.21KB
  8. TabViewModel/mainwindow.h 428B
  9. TabViewModel/progressbardelegate.cpp 1.51KB
  10. TabViewModel/progressbardelegate.h 436B
  11. TabViewModel/sortfilterproxymodel.cpp 654B
  12. TabViewModel/sortfilterproxymodel.h 436B
  13. TabViewModel/student.h 339B
  14. TabViewModel/studenttablemodel.cpp 3.27KB
  15. TabViewModel/studenttablemodel.h 907B
  16. TabViewModel/stuedenttable.cpp 1.89KB
  17. TabViewModel/stuedenttable.h 586B
  18. TabViewModel/TabViewModel.pro 1.33KB

资源介绍:

本实例基于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 信号 }
100+评论
captcha