How to get list of visible QModelIndex in QAbstractItemView

Dmitry Sazonov picture Dmitry Sazonov · Apr 4, 2013 · Viewed 8.4k times · Source

Is there any way to get a list of currently visible items in QAbstractItemView? And, if it possible, to receive any notifications about changing of this list.

Upd: I'm asking exactly about QAbstractItemView or QTreeView with non-plain structure, not QTableView.

Upd2: I'm implementing tree view model with checkboxes. I want next behavior (same for checking/uncheking):

  • If one of checkbox is checked - then all childs must be checked
  • If all child checkboxes are checked - then parent check box should be checked too. And same for parent of parent, and so on...

Check state are monitored/modified by external data source, so I need a mechanism to update all changed children/parents. dataChanged signal is not enough for me because it is very expansive to build a list of all changed QModelIndex for updating. And it is not necessary at all, because all fresh data will be picked from QAbstractItemModel::data.

I found next dirty hack to update all items: emit dataChanged( QModelIndex(), QModelIndex() ); but it's undocumented for invalid indexes.

So, I need a way to force all visible items redraw they content with fresh data.

Answer

Min Lin picture Min Lin · Apr 4, 2013

You can get the topleft and bottom right cell by calling:

tableview->indexAt(tableview->rect().topLeft())
tableview->indexAt(tableview->rect().bottomRight())

To get notification of change, reimplement the virtual function of qabstractscrollarea

scrollContentsBy

This function is called when the view port is scrolled. call QTableView::scrollContentsBy and then do whatever you need to.