如何在QAbstractItemView中获取可见QModelIndex的列表

Dmi*_*nov 6 model-view-controller qt qmodelindex qabstractitemview

有没有办法获得当前可见项目的列表QAbstractItemView?并且,如果可能,接收有关更改此列表的任何通知.

UPD:我问的正是有关QAbstractItemViewQTreeView与非普通的结构,而不是QTableView.

Upd2:我正在用复选框实现树视图模型.我想要下一个行为(检查/取消检查相同):

  • 如果选中其中一个复选框 - 则必须检查所有子项
  • 如果选中所有子复选框 - 则也应检查父复选框.父母的父母也一样,等等......

检查状态由外部数据源监视/修改,因此我需要一种机制来更新所有已更改的子项/父项.dataChanged信号对我来说还不够,因为构建一个QModelIndex更新的所有更改列表是非常广泛的.并且根本没有必要,因为将从中挑选所有新数据QAbstractItemModel::data.

我发现下一个脏黑客更新所有项目:emit dataChanged( QModelIndex(), QModelIndex() );但它没有记录无效索引.

所以,我需要一种方法来强制所有可见的项目重新绘制内容和新数据.

Min*_*Lin 11

您可以通过调用以获取topleft和right right单元格:

tableview->indexAt(tableview->rect().topLeft())
tableview->indexAt(tableview->rect().bottomRight())
Run Code Online (Sandbox Code Playgroud)

要获得更改通知,请重新实现qabstractscrollarea的虚函数

scrollContentsBy
Run Code Online (Sandbox Code Playgroud)

滚动视图端口时会调用此函数.调用QTableView :: scrollContentsBy,然后执行您需要的任何操作.

  • indexAt 是不可接受的,因为我使用 QTreeView 并且某些项目不适合所有行。请参阅原始问题的更新。 (2认同)

Dmi*_*nov 0

我认为在任何情况下都不需要可见项目列表。如果模型实施正确,所有项目都会自动更新。实施的困难部分——强迫孩子和家长更新。我写了以下代码:

bool TreeModel::setData( const QModelIndex &index, const QVariant &value, int role )
case Qt::CheckStateRole:
        {
            TreeItemList updateRangeList;  // Filled with items, in which all childred must be updated
            TreeItemList updateSingleList; // Filled with items, which must be updated
            item->setCheckState( value.toBool(), updateRangeList, updateSingleList ); // All magic there
            foreach ( TreeAbstractItem *i, updateRangeList )
            {
                const int nRows = i->rowCount();
                QModelIndex topLeft = indexForItem( i->m_childs[0] );
                QModelIndex bottomRight = indexForItem( i->m_childs[nRows - 1] );
                emit dataChanged( topLeft, bottomRight );
            }
            foreach ( TreeAbstractItem *i, updateSingleList )
            {
                QModelIndex updateIndex = indexForItem( i );
                emit dataChanged( updateIndex, updateIndex );
            }
        }
Run Code Online (Sandbox Code Playgroud)