2017-08-08 33 views
1

我使用QTableView來顯示只讀數據。該模型基於包含另一個QList的自定義類型的QList。事情是這樣的:QTableView:動態更改rowCount

typedef struct 
{ 
    int range; 
    QString description; 
} Field; 

typedef struct 
{ 
    QString name; 
    QList<Field> fields; 
} Item; 

QList<Item> items; 

在我QAbstractTableModel實現我有一個選擇當前item插槽:

void setCurrentItem(int idx) 
{ 
    // checks for errors (omissis) 
    currentItemIdx = idx; 

    // ask to redraw the table 
    emit dataChanged(this->index(0, 0), this->index(rowCount(), columnCount())); 
} 

所有模型的邏輯依賴於該項目,例如:

int MyModel::rowCount(const QModelIndex&) const { 
    return items.at(m_currentItemIdx).fields.count(); 
} 

QVariant MyModel::data(const QModelIndex &index, int role) const { 
    if (!index.isValid()) return QVariant(); 
    if (index.row() >= items.at(m_currentItemIdx).fields.count()) return QVariant(); 

    Field f = items.at(m_currentItemIdx).fields.at(index.row); 
    switch (role) { 
    case Qt::DisplayRole: 
     switch (index.column()){ 
     case 0: 
      return f.range; 
      break; 

     case 1: 
      return f.description; 
      break; 

     default: 
      return QVariant(); 
     } 
     break; 
    } 
    return QVariant(); 
} 

問題是當我使用setCurrentItem()更改當前項目時代碼使用新數據,但QTableView不會更改它的行,然後不請求新的內容。

我以爲emit dataChanged()夠了,但它似乎沒有。 我應該怎麼做才能通知我改變模型大小的觀點?

我試圖避免插入/刪除行機制,因爲我不想更改QList中的實際數據,我只是想拿起一組不同的信息。

+1

既然你完全更新表中的數據,我想,調用'化QAbstractItemModel ::復位()'將執行你想要什麼。即'void setCurrentItem(int idx){currentItemIdx = idx;重啓(); }' – vahancho

回答

3

更改您的模型數據後,請致電QAbstractItemModel::​beginResetModel()之前和QAbstractItemModel::​endResetModel()

像這樣:

void setCurrentItem(int idx) 
{ 
    beginResetModel(); 
    currentItemIdx = idx; 
    endResetModel(); 
}