2012-01-08 196 views
1

下面顯示的是我的自定義表模型。我正在試圖將這個tablemodel與QTableView一起使用。如果調用表模型的方法追加,我希望表視圖更新其內容。但它不,我不知道爲什麼。但是,如果我將同一個表模型和QListView一起使用,那麼一切正常,即當列表視圖的附加被調用時,列表視圖不會更新其內容。在QTableView的情況下,我需要做什麼嗎?QTableView似乎對dataChanged信號沒有反應

class MyModel : public QAbstractTableModel 
{ 
public: 

    MyModel(QObject* parent=NULL) : QAbstractTableModel(parent) {} 

    int rowCount(const QModelIndex &parent = QModelIndex()) const { 
     return mData.size(); 
    } 

    int columnCount(const QModelIndex &parent = QModelIndex()) const { 
     return 2; 
    } 

    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const { 
     if (!index.isValid()) { 
      return QVariant(); 
     } 

     if (role == Qt::DisplayRole) { 
      if (index.column()==0) { 
       return QVariant(QString::fromStdString(getFirst(index.row()))); 
      } 
      if (index.column()==1) { 
       return QVariant(QString::fromStdString(getSecond(index.row()))); 
      } 
     } 

     return QVariant(); 
    } 

    void append(std::string const& first, std::string const& second) { 
     mData.push_back(std::make_pair(first, second)); 

     emit dataChanged(index(mData.size()-1, 0), index(mData.size()-1, 1)); 
    } 

    std::string const& getFirst(int i) const { 
     return mData[i].first; 
    } 

    std::string const& getSecond(int i) const { 
     return mData[i].second; 
    } 

protected: 

    std::vector<std::pair<std::string, std::string> > mData; 
}; 

回答

3

當你插入新行,而不是改變現有的數據,你應該使用beginInsertRows和endInsertRows代替:

void append(std::string const& first, std::string const& second) { 
    int row = mData.size(); 
    beginInsertRows(QModelIndex(), row, row); 

    mData.push_back(std::make_pair(first, second)); 

    endInsertRows(); 
} 

看看是否有幫助。

+1

這幫了我。你有鏈接到你找到這個答案的文檔嗎? – qwerty9967 2013-03-10 16:11:20

+0

beginInsertRows/endInsert行的用法可以在[QAbstractItemModel類](http://qt-project.org/doc/qt-4.8/qabstractitemmodel.html#beginInsertRows)的Qt文檔中找到。 – JediLlama 2013-04-21 08:29:26