运行结果如下:
代码如下:
#include <QList> #include <QStringList> #include <QAbstractTableModel> class CStudioTableModel :public QAbstractTableModel { public: CStudioTableModel(QObject *parent = 0); ~CStudioTableModel(); int rowCount(const QModelIndex & parent = QModelIndex()) const; int columnCount(const QModelIndex &parent = QModelIndex()) const; QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const; QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const; bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole ); void InsertItems(const QList<StudioInfo>& lstDatas); void InsertItem(const StudioInfo& dat); void DelItems(); void DelItem(const QString& szStudioID); protected: QStringList m_header; QList<StudioInfo> m_lstData; }; CStudioTableModel::CStudioTableModel(QObject *parent /*= 0*/) :QAbstractTableModel(parent) { m_header.clear(); m_header << "ID" << "NAME" << "Address" << "Age" << "Sex"; m_lstData.clear(); } CStudioTableModel::~CStudioTableModel() { } int CStudioTableModel::rowCount(const QModelIndex & parent /*= QModelIndex()*/) const { return m_lstData.count(); } int CStudioTableModel::columnCount(const QModelIndex &parent /*= QModelIndex()*/) const { return m_header.count(); } QVariant CStudioTableModel::headerData(int section, Qt::Orientation orientation, int role /*= Qt::DisplayRole*/) const { if (section >= 0 && section < columnCount()) { if (orientation == Qt::Horizontal) { switch (role) { case Qt::DisplayRole: return m_header[section]; break; } } else { switch (role) { case Qt::DisplayRole: return section+1; break; } } } return QVariant(); } QVariant CStudioTableModel::data(const QModelIndex & index, int role) const { if (!index.isValid()) { return QVariant(); } int nRow = index.row(); int nCol = index.column(); if (nRow>= rowCount() || nRow<0 || nCol>= columnCount() || nCol<0) { return QVariant(); } switch (role) { case Qt::DisplayRole: switch (nCol) { case 0: return m_lstData[nRow].szStudioID; break; case 1: return m_lstData[nRow].szStudioName; break; case 2: return m_lstData[nRow].szAddress; break; case 3: return m_lstData[nRow].nAge; break; case 4: return m_lstData[nRow].bMan ? "Male":"female"; break; default: return QVariant(); break; } break; } return QVariant(); } bool CStudioTableModel::setData(const QModelIndex &index, const QVariant &value, int role /* = Qt::EditRole */) { if (!index.isValid()) { return false; } int nRow = index.row(); int nCol = index.column(); if (nRow>= rowCount() || nRow<0 || nCol>= columnCount() || nCol<0) { return false; } switch (role) { case Qt::EditRole: switch (nCol) { case 0: m_lstData[nRow].szStudioID = value.toString(); break; case 1: m_lstData[nRow].szStudioName = value.toString(); break; case 2: m_lstData[nRow].szAddress = value.toString(); break; case 3: m_lstData[nRow].nAge = value.toInt(); break; case 4: m_lstData[nRow].bMan = value.toBool(); break; default: return false; break; } break; default: return false; break; } emit dataChanged(index, index); return true; } void CStudioTableModel::InsertItems(const QList<StudioInfo>& lstDatas) { DelItems(); int nCount = lstDatas.count(); if (nCount > 0) { beginInsertRows(QModelIndex(), 0, nCount - 1); m_lstData = lstDatas; endInsertRows(); } } void CStudioTableModel::InsertItem(const StudioInfo& dat) { int nCount = rowCount(); beginInsertRows(QModelIndex(), nCount, nCount); m_lstData.push_back(dat); endInsertRows(); } void CStudioTableModel::DelItems() { int nCount = rowCount(); if (nCount > 0) { beginRemoveRows(QModelIndex(), 0, nCount - 1); m_lstData.clear(); endRemoveRows(); } } void CStudioTableModel::DelItem(const QString& szStudioID) { for (int i=0; i<m_lstData.count(); i++) { if(m_lstData[i].szStudioID == szStudioID) { if (rowCount() > i) { beginRemoveRows(QModelIndex(), i, i); m_lstData.removeAt(i); endRemoveRows(); break; } } } }
QTableView是一个N行N列的控件,上述代码包括了修改某行的学生免费精选名字大全,增加一行/多行学生信息,删除一行/多行学生信息。需要注意的是增加要在beginInsertRows和endInsertRows之间做,而删除则是 beginRemoveRows()和endRemoveRows()之间。
rowCount用来通知model有多少行数据,columnCount用来通知model有多少列数据,data用来返回view的表格内容所需要的的数据,headerdata返回view的表格表头所需要的的数据,有垂直和水平的表头;Qt::Displayrole是model用来存储展现给用户的数据的,角色可以理解为数组,还有其他角色,读者可自行查看帮助文档。setData则是用来设置数据的,数据修改后要emit信号datachanged,这样view才会及时更新数据;
model的使用:
QTableView* pTableView = new QTableView(this); CStudioTableModel* pTableModel = new CStudioTableModel(this); pTableView->setModel(pTableModel); pTableModel->InsertItems(lstData);
c/c++开发分享QTableView实现表格显示,自定义model地址:https://blog.csdn.net/zsq1294110449/article/details/110198036
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/596603.html