Восстановление вертикальной прокрутки в QTableView

Я использую C++, Qt 4.8.7, Visual Studio 2013, Windows 7. Мое приложение с графическим интерфейсом содержит QTableView. Я добавил слоты, которые обрабатывают сигналы beginResetModel() и reset() из моей модели. Эти слоты обычно вызываются, но вертикальная прокрутка по-прежнему всегда прокручивает вверх всего списка. Как я могу это исправить? Мне нужно восстановить текущую позицию. Обратите внимание, что во время сброса ни одна строка не удаляется. Таким образом, содержимое старых строк может быть изменено и/или добавлены новые строки.

//before reset
current_top_row_number_ = table_view_->rowAt(0);

//after reset
table_view_->scrollTo(log_model_->index(current_top_row_number_, 0), QAbstractItemView::PositionAtTop); 

person ilya    schedule 02.08.2016    source источник


Ответы (1)


Попробуйте поставить вызов в очередь на scrollTo, например.

class MyWidget : public MyWidget {
  Q_OBJECT
  int current_top_row_number_;
  QTableView table_view_;
  Q_SLOT void onResetModel() {
    table_view_->scrollTo(log_model_->index(current_top_row_number_, 0),
                          QAbstractItemView::PositionAtTop);
  }
  ...
public:
  MyWidget(QWidget * parent = nullptr) : QWidget{parent} {     
    connect(table_view_, SIGNAL(modelReset()), SLOT(onResetModel(), Qt::QueuedConnection);
  }
};
person Kuba hasn't forgotten Monica    schedule 02.08.2016