2016-07-31 89 views
1

几天前,我发布了question。我已经成功地克服这个问题,问题如下实施QAbstractTableModelQTableView添加记录,首先是好的,其他都是空行

头文件:

#ifndef UECONNECTEDCLIENTSTABLEMODEL_H 
#define UECONNECTEDCLIENTSTABLEMODEL_H 

#include <QObject> 
#include <QAbstractTableModel> 
#include <QList> 
#include <QModelIndex> 
#include <QVariant> 
#include <QHash> 
#include <QByteArray> 

#include "ueconnectedclientrecord.h" 

class UeConnectedClientsTableModel : public QAbstractTableModel 
{ 
    Q_OBJECT 

private: 
    /** 
    * @brief m_ueConnectedClientData 
    */ 
    QList<UeConnectedClientRecord*> m_ueConnectedClientData; 

protected: 
    /** 
    * @brief ueSetConnectedClientData 
    * @param clientData 
    */ 
    inline void ueSetConnectedClientData(const QList<UeConnectedClientRecord*>& clientData) 
     { this->m_ueConnectedClientData=clientData; } 

public: 
    /** 
    * @brief UeConnectedClientsTableModel 
    * @param parent 
    */ 
    UeConnectedClientsTableModel(QObject* parent=Q_NULLPTR); 

    /** 
    * @brief ueConnectedClientData 
    * @return connected client data 
    */ 
    inline const QList<UeConnectedClientRecord*>& ueConnectedClientData() const 
     { return this->m_ueConnectedClientData; } 

    /** 
    * @brief rowCount 
    * @param parent 
    * @return number of rows in model 
    */ 
    int rowCount(const QModelIndex& parent) const; 

    /** 
    * @brief columnCount 
    * @return number of columns in model 
    */ 
    int columnCount(const QModelIndex& parent) const; 

    /** 
    * @brief data 
    * @param index 
    * @param role 
    * @return data for index 
    */ 
    QVariant data(const QModelIndex& index, 
        int role=Qt::DisplayRole) const; 

    /** 
    * @brief headerData 
    * @param section 
    * @param orientation 
    * @param role 
    * @return header data 
    */ 
    QVariant headerData(int section, 
         Qt::Orientation orientation, 
         int role=Qt::DisplayRole) const; 

    /** 
    * @brief insertRows 
    * @param row 
    * @param count 
    * @param parent 
    * @return true if the rows were successfully inserted; otherwise returns false 
    */ 
    bool insertRows(int row, 
        int count, 
        const QModelIndex& parent=QModelIndex()); 

    /** 
    * @brief setData 
    * @param index 
    * @param value 
    * @param role 
    * @return true if successful; otherwise returns false 
    */ 
    bool setData(const QModelIndex &index, 
       const QVariant &value, 
       int role = Qt::EditRole); 
}; 

#endif // UECONNECTEDCLIENTSTABLEMODEL_H 

实现文件:

QVariant UeConnectedClientsTableModel::data(const QModelIndex& index, 
              int role) const 
{ 
    if(!index.isValid()||index.row()>this->ueConnectedClientData().size()||index.row()<0||index.column()>UeConnectedClientRecord::NUMBER_OF_FILEDS||index.column()<0) 
     return QVariant(); 

    switch(role) 
    { 
     case Qt::DisplayRole: 
     { 
      switch(index.column()) 
      { 
       case UeConnectedClientRecord::INDEX_CLIENT_NAME: 
       { 
        return this->ueConnectedClientData().at(index.row())->ueClientName(); 
       } // case 

       case UeConnectedClientRecord::INDEX_CLIENT_ADDRESS: 
       { 
        return this->ueConnectedClientData().at(index.row())->ueClientAddress().toString(); 
       } // case 

       case UeConnectedClientRecord::INDEX_CLIENT_PORT: 
       { 
        return this->ueConnectedClientData().at(index.row())->ueClientPort(); 
       } // case 
      } // switch 
     } // case 
    } // switch 

    return QVariant(); 
} // data 

QVariant UeConnectedClientsTableModel::headerData(int section, 
                Qt::Orientation orientation, 
                int role) const 
{ 
    if(role!=Qt::DisplayRole) 
     return QVariant(); 

    switch(orientation) 
    { 
     case Qt::Horizontal: 
     { 
      switch(section) 
      { 
       case UeConnectedClientRecord::INDEX_CLIENT_NAME: 
       { 
        return tr("Client name"); 
       } // case 

       case UeConnectedClientRecord::INDEX_CLIENT_ADDRESS: 
       { 
        return tr("Client address"); 
       } // case 

       case UeConnectedClientRecord::INDEX_CLIENT_PORT: 
       { 
        return tr("Client port"); 
       } // case 

       default: 
       { 
        return QVariant(); 
       } // default 
      } // switch 
     } // case 

     case Qt::Vertical: 
     { 
      return QAbstractTableModel::headerData(section, 
                orientation, 
                role); 
     } // case 
    } // switch 

    return QVariant(); 
} // headerData 

bool UeConnectedClientsTableModel::insertRows(int row, 
               int count, 
               const QModelIndex& parent) 
{ 
    Q_UNUSED(parent) 

    this->beginInsertRows(QModelIndex(), 
          row, 
          row+count-1); 

    for(int index=row; index<row+count; index++) 
    { 
     m_ueConnectedClientData.append(new UeConnectedClientRecord()); 
    } // for 

    this->endInsertRows(); 

    return true; 
} // insertRows 

bool UeConnectedClientsTableModel::setData(const QModelIndex& index, 
              const QVariant& value, 
              int role) 
{ 
    if(!index.isValid()||index.row()>this->ueConnectedClientData().size()||index.row()<0||index.column()>UeConnectedClientRecord::NUMBER_OF_FILEDS||index.column()<0||role!=Qt::EditRole) 
    { 
     return false; 
    } 
    else 
    { 
     int row=index.row(); 
     int column=index.column(); 

     switch(column) 
     { 
      case UeConnectedClientRecord::INDEX_CLIENT_NAME: 
      { 
       this->ueConnectedClientData().at(row)->ueSetClientName(value.toString()); 

       break; 
      } // case 

      case UeConnectedClientRecord::INDEX_CLIENT_ADDRESS: 
      { 
       this->ueConnectedClientData().at(row)->ueSetClientAddress(QHostAddress(value.toString())); 

       break; 
      } // case 

      case UeConnectedClientRecord::INDEX_CLIENT_PORT: 
      { 
       this->ueConnectedClientData().at(row)->ueSetClientPort(value.toString()); 

       break; 
      } // case 
     } // switch 

     emit(dataChanged(index, 
         index)); 
    } // if 

    return true; 
} // setData 

int UeConnectedClientsTableModel::rowCount(const QModelIndex& parent) const 
{ 
    Q_UNUSED(parent) 

    return this->ueConnectedClientData().size(); 
} // rowCount 

int UeConnectedClientsTableModel::columnCount(const QModelIndex& parent) const 
{ 
    Q_UNUSED(parent) 

    return UeConnectedClientRecord::NUMBER_OF_FILEDS; 
} // columnCount 

现在,当我添加一行到QTableView,首先添加的行数据是好的,其他都是空行: QTableView empty rows
我已经三重检查,如果实际的数据输入setData()方法和他们是,所以为什么我坚持添加空行?

+1

只是调试。如果您确定数据是在'setData'中分配的,请查看'data'方法。 P.S .:这不是一种情况,但你在data中的上限检查应该像'index.row()> = ueConnectedClientData()。size()'(用'> =')。 – ilotXXI

回答

0

我设法解决了这个问题。我已经错过了一个微小的细节,从insertRows()

如果行0,行预先计划在 父的任何现有行。

如果row是rowCount(),则这些行会附加到父级的 中的任何现有行。

appending数据内部QList

bool UeConnectedClientsTableModel::insertRows(int row, 
               int count, 
               const QModelIndex& parent) 
{ 
    Q_UNUSED(parent) 

    this->beginInsertRows(QModelIndex()/*parent*/, 
          row, 
          row+count-1); 

    for(int index=row; index<row+count; ++index) 
    { 
     m_ueConnectedClientData.append(new UeConnectedClientRecord()); 
    } // for 

    this->endInsertRows(); 

    return true; 
} // insertRows 

在的QList,而不是inserting它开始在年底

bool UeConnectedClientsTableModel::insertRows(int row, 
               int count, 
               const QModelIndex& parent) 
{ 
    Q_UNUSED(parent) 

    this->beginInsertRows(QModelIndex()/*parent*/, 
          row, 
          row+count-1); 

    for(int index=row; index<row+count; ++index) 
    { 
     m_ueConnectedClientData.insert(row, 
             new UeConnectedClientRecord()); 
    } // for 

    this->endInsertRows(); 

    return true; 
} // insertRows 

现在它工作正常:
ueConnectedClientsTableWorks.png

相关问题