用户登录
用户注册

分享至

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

  • 作者: 烟花寂寞丶
  • 来源: 51数据库
  • 2021-09-21

运行结果如下:

代码如下:

#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);

?

?

软件
前端设计
程序设计
Java相关