Проблема с функциональностью QTableWidget.scrollToItem

#python #pyqt5 #qtablewidget #scrollto

#python #pyqt5 #qtablewidget #scrollto

Вопрос:

борюсь с проблемой:

Я использую эту функцию для начального представления положения в центре большой таблицы.

Путем создания объекта QTableWidget, когда приложение только загружается, и заполнения таблицы новыми данными (включая новые столбцы / строки) перед ее отображением: (нажатием кнопки)

 ...
self.table.scrollToItem(self.tabl.item(central_row, 0), QAbstractItemView.PositionAtCenter)
self.table_ticker.scrollToItem(self.table.selectRow(central_row), QAbstractItemView.PositionAtCenter)
...
  

Итак, у меня есть 2 проблемы, которые я не могу понять:

  1. позиционирование не работает корректно при первом вызове, но только со 2-го раза (нажатием кнопки) или более. Иногда и в первый раз видна только пара столбцов. Я предполагаю, что QTableWidget требует некоторого внутреннего обновления etc, я попробовал это:

          self.table.updateGeometry()
         self.table.update()
         self.table.updateEditorGeometries()
      

    но это не помогает.

  2. Мне не нужно делать какой-либо выбор, подобный приведенному выше:

self.table.selectRow(central_row)

но без этого трюка позиционирование вообще не работает. Конечно, я могу выполнить clearSelection, но есть ли другие способы сделать это?

Спасибо.

Комментарии:

1. Центрирование на представлении элемента во время инициализации — это то, что редко работает, поскольку в этот момент виджеты еще не сопоставлены, и их область может еще долго меняться, пока окно не будет окончательно показано. Вы пробовали использовать таймер одиночной съемки? QTimer.singleshot(0, self.functionThatCenters) (обратите внимание, что все эти update*() вызовы совершенно не нужны, если виджет еще не показан)

2. спасибо за идею, self.timer.timeout.connect(лямбда: self. PosAtCenter ()) решил все.