首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在QAbstractItemView中获取可见QModelIndex列表

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

Stack Overflow用户
提问于 2013-04-05 01:07:50
回答 5查看 8.2K关注 0票数 7

有没有办法在QAbstractItemView中获得当前可见项目的列表?并且,如果可能的话,接收关于该列表的改变的任何通知。

更新:我问的是具有非纯结构的QAbstractItemViewQTreeView,而不是QTableView

Upd2:我正在实现带有复选框的树视图模型。我想要下一个行为(与选中/取消选中相同):

  • 如果选中其中一个复选框,则所有孩子都必须选中
  • 如果选中了所有孩子复选框,则也应该选中父复选框。对于父级的父级也是如此,依此类推...

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

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

因此,我需要一种方法来强制所有可见的项目重新绘制他们的内容与新的数据。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-04-08 17:01:44

我认为不存在重新请求可见项列表的情况。在正确实现模型的情况下,所有项目都会自动更新。实现的难点--强制孩子和家长更新。我写了以下代码:

代码语言:javascript
运行
复制
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 );
            }
        }
票数 0
EN

Stack Overflow用户

发布于 2013-04-05 01:44:20

您可以通过调用以下命令获得右上角和右下角的单元格:

代码语言:javascript
运行
复制
tableview->indexAt(tableview->rect().topLeft())
tableview->indexAt(tableview->rect().bottomRight())

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

代码语言:javascript
运行
复制
scrollContentsBy

此函数在查看端口滚动时调用。调用QTableView::scrollContentsBy,然后执行所需的任何操作。

票数 12
EN

Stack Overflow用户

发布于 2014-03-14 03:58:55

对于QTreeView,可见项列表可以像这样遍历:

代码语言:javascript
运行
复制
QTreeView& tv (yourTreeView);

// Get model index for first visible item
QModelIndex modelIndex = tv.indexAt(tv.rect().topLeft());

while (modelIndex.isValid())
{
    // do something with the item indexed by modelIndex
    ...
    // This navigates to the next visible item
    modelIndex = tv.indexBelow(modelIndex);
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15817429

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档