我确信有一种简单的方法可以获得这个号码,但找不到任何号码。
答案 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
子类中,因此this
是QTreeView
。
10
是一个任意的边距,应该将其调整为可行的最低值; 0
不起作用。