找出适合QTreeView的项目数(屏幕上可见的行数)

时间:2014-06-26 16:53:17

标签: qt qtreeview

我确信有一种简单的方法可以获得这个号码,但找不到任何号码。

2 个答案:

答案 0 :(得分:3)

无法确定空视图,因为它可能因项目而异。内容。如果视图中已有项目,您可以计算QAbstractItemView::visualRect并将其与viewport() rect()相交,以查看特定项目是否可见。因此,您可以遍历行并检查项是否可见。例如:

for(int row = 0; row < view.model()->rowCount(); row++) {
  if (!view.visualRect(view.model()->index(row, 0)).intersects(view.viewport()->rect())) {
    return row;
  }
}

但是,只有当您只有顶级项目并且有足够的项目来填充视口时,这才有效。

或者,您可以调用view.indexAt(QPoint(0, 0))view.indexAt(QPoint(0, view.viewport()->height()))并比较索引。但是,如果这些索引不共享同一个父级,则计算行将变得很麻烦。

答案 1 :(得分:0)

基于Pavel Strakhov的答案,我认为我设法重新编写了代码,因此它不需要所有项目上的for循环,因此是O(1)而不是O(N) (其中N是模型中的项目数):

int CFileListView::numRowsVisible() const
{
    const auto viewportRect = viewport()->rect();
    const auto topIndex = indexAt(QPoint{ 10, viewportRect.top() + 1 });
    const auto bottomIndex = indexAt(QPoint{ 10, viewportRect.bottom() - 1 });

    if (!topIndex.isValid())
    {
        assert(!bottomIndex.isValid());
        return 0;
    }

    return bottomIndex.isValid() ? bottomIndex.row() - topIndex.row() : model()->rowCount() - topIndex.row();
}

它在我的QTreeView子类中,因此thisQTreeView10是一个任意的边距,应该将其调整为可行的最低值; 0不起作用。