user672033
user672033

Reputation:

Why doesn't QTableView row count update?

I created a QAbstractTableModel called PresetTableModel, and connected it to a QTableView. I implemented the rowCount, columnCount, and data functions. Everything works if I have rowCount return a fixed number, but as soon as I get it to return a variable value, the list view doesn't show any rows. The debug statement in the code below shows the size value starting at 0, but changing to 9 once the list gets populated.

int PresetTableModel::rowCount(const QModelIndex & /*parent*/) const
{
    qDebug() << preset_list.count();
    return preset_list.size();
}

Is there something else I need to do to force it to update the number of rows?

Upvotes: 3

Views: 6186

Answers (2)

roberto
roberto

Reputation: 577

i use:

 void refresh() {
    emit dataChanged(index(0, 0),
                     index(rowCount(), columnCount()));  // update whole view
    emit layoutChanged();
  }

Upvotes: 3

Frank Osterfeld
Frank Osterfeld

Reputation: 25155

When modifying the underlying data, you must use the model's notification mechanism to notify the views. E.g, when appending data:

beginInsertRows(QModelIndex(), preset_list.size(), preset_list.size()+1); //notify that two rows will be appended (rows size() and size() + 1)
preset_list.append(something);
preset_list.append(somethingelse);
endInsertRows(); //notify views that you're done with modifying the underlying data 

Accordingly, you have to call beginRemoveRows() and endRemoveRows() when removing rows, and emit dataChanged() when existing entries are updated.

On a side note, your rowCount() method should read

if (!parent.isValid())
    return preset_list.size(); //top-level: return list size
else
    return 0; //list item: no further children (flat list)

to limit the depth. Otherwise each item in the list has again preset_list.size() entries.

Upvotes: 7

Related Questions