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
中的實際數據,我只是想拿起一組不同的信息。
既然你完全更新表中的數據,我想,調用'化QAbstractItemModel ::復位()'將執行你想要什麼。即'void setCurrentItem(int idx){currentItemIdx = idx;重啓(); }' – vahancho