Почему не обновляется счетчик строк QTableView? - PullRequest
3 голосов
/ 22 декабря 2011

Я создал QAbstractTableModel с именем PresetTableModel и подключил его к QTableView. Я реализовал функции rowCount, columnCount и данные. Все работает, если у меня rowCount возвращает фиксированное число, но как только я получаю его, чтобы вернуть значение переменной, представление списка не показывает никаких строк. Оператор отладки в приведенном ниже коде показывает значение размера, начинающееся с 0, но изменяющее на 9 после заполнения списка.

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

Есть ли что-то еще, что мне нужно сделать, чтобы заставить его обновить количество строк?

Ответы [ 2 ]

6 голосов
/ 22 декабря 2011

При изменении базовых данных вы должны использовать механизм уведомлений модели для уведомления представлений.Например, при добавлении данных:

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 

Соответственно, вы должны вызывать beginRemoveRows () и endRemoveRows () при удалении строк и вызывать dataChanged () при обновлении существующих записей.

Вклпримечание: ваш метод rowCount () должен иметь значение

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

, чтобы ограничить глубину.В противном случае каждый элемент в списке снова содержит записи preset_list.size ().

0 голосов
/ 30 августа 2017

я использую:

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