TabViewModel.zip
大小:10.72KB
价格:17积分
下载量:0
评分:
5.0
上传者:u012959478
更新日期:2025-09-22

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

资源文件列表(大概)

文件名
大小
TabViewModel/
-
TabViewModel/buttondelegate.cpp
2.59KB
TabViewModel/buttondelegate.h
636B
TabViewModel/comboboxdelegate.cpp
943B
TabViewModel/comboboxdelegate.h
750B
TabViewModel/main.cpp
194B
TabViewModel/mainwindow.cpp
2.21KB
TabViewModel/mainwindow.h
428B
TabViewModel/progressbardelegate.cpp
1.51KB
TabViewModel/progressbardelegate.h
436B
TabViewModel/sortfilterproxymodel.cpp
654B
TabViewModel/sortfilterproxymodel.h
436B
TabViewModel/student.h
339B
TabViewModel/studenttablemodel.cpp
3.27KB
TabViewModel/studenttablemodel.h
907B
TabViewModel/stuedenttable.cpp
1.89KB
TabViewModel/stuedenttable.h
586B
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<Student *> &students){ beginResetModel(); //重置数据之前调用,会自动触发 modelAboutToBeReset 信号 m_students = students; endResetModel(); //重置数据完成后调用,会自动触发 modelReset 信号}

用户评论 (0)

发表评论

captcha