c/c++语言开发共享QTableView实现表格显示,自定义model

运行结果如下:代码如下:#include <QList>#include <QStringList>#include <QAbstractTableModel>class CStudioTableModel :public QAbstractTableModel{public: CStudioTableModel(QObject *parent = 0); ~CStudioTableModel(); int rowCoun

运行结果如下:

QTableView实现表格显示,自定义model

代码如下:

#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

(0)
上一篇 2021年5月8日
下一篇 2021年5月8日

精彩推荐