Обновление QListView не работает

Нужна помощь, чтобы выяснить, почему мой QListView не обновляется.

Я использую QListView с QSqlTableModel. Я реализую модель в следующей функции. Я вызываю эту функцию из конструктора класса.

void myclass::refresh()
{
     model_path = new QSqlTableModel(this);
     model_path->setTable("mytable");
     model_path->setEditStrategy(QSqlTableModel::OnManualSubmit);
     model_path->select();
     ui->listView_path->setModel(model_path);
     ui->listView_path->setModelColumn(1);
 }

Следующая функция добавит строку, и qlistView обновится без каких-либо проблем.

 void myclass::on_pushButton_add_clicked()
 {
     QSqlRecord rec (model_path->record());
     rec.setValue(1,ui->lineEdit->text());
     rec.setValue(2,2);

     model_path->insertRecord(-1, rec);
     emit model_path->layoutChanged();
 }

Следующая функция удалит строку в зависимости от того, какая строка выделена в QListView. Удаление работает, поскольку строка удаляется из базы данных после выполнения .submitAll. Однако QListView не обновляется постоянно.

 void myclass::on_pushButton_remove_clicked()
 {
     model_path->removeRow(ui->listView_path->currentIndex().row());
     emit model_path->dataChanged(ui->listView_path->currentIndex(),ui->listView_path->currentIndex());
     emit model_path->layoutChanged();
 }

Если я удалю строку, список не обновится. Если я добавлю одну или несколько новых строк, а затем удалю одну или все из них, они будут обновлены. Как видите, я использую как dataChanged, так и layoutChanged, но здесь они, кажется, мало что делают.

Я не понимаю, почему обновление не является последовательным. Кто-нибудь может помочь?


person David    schedule 03.06.2014    source источник


Ответы (1)


Вам не нужно вызывать как layoutChanged, так и dataChanged при добавлении или удалении некоторых строк. Они не предназначены для такого рода обновлений. Ознакомьтесь с документацией.

Возможно, ваша проблема заключается в понимании стратегии редактирования QSqlTableModel::OnManualSubmit. Попробуйте изменить его на QSqlTableModel::OnFieldChange

person Dmitry Sazonov    schedule 03.06.2014
comment
Спасибо за ответ. Я использую как layoutChanged, так и dataChanged только для того, чтобы показать, что ни один из них не работает. Кроме того, OnManualSubmit является правильной стратегией редактирования для этого, поскольку я фиксирую изменения только в конце. - person David; 03.06.2014