我不知道。我们来看看源代码。 :)
查看代码,here's http://code.qt.io/cgit/qt/qtdeclarative.git/tree/src/quick/items/qquickitemview.cpp哪里的contentWidth
and contentHeight
已设置:
void QQuickItemViewPrivate::updateViewport()
{
Q_Q(QQuickItemView);
qreal extra = headerSize() + footerSize();
qreal contentSize = isValid() || !visibleItems.isEmpty() ? (endPosition() - startPosition()) : 0.0;
if (layoutOrientation() == Qt::Vertical)
q->setContentHeight(contentSize + extra);
else
q->setContentWidth(contentSize + extra);
}
The startPosition()
and endPosition()
函数被声明here http://code.qt.io/cgit/qt/qtdeclarative.git/tree/src/quick/items/qquickitemview.cpp#n1596:
qreal QQuickItemViewPrivate::startPosition() const
{
return isContentFlowReversed() ? -lastPosition() : originPosition();
}
qreal QQuickItemViewPrivate::endPosition() const
{
return isContentFlowReversed() ? -originPosition() : lastPosition();
}
QQuickListView
的实现originPosition()
and lastPosition()
都是here http://code.qt.io/cgit/qt/qtdeclarative.git/tree/src/quick/items/qquicklistview.cpp#n423:
qreal QQuickListViewPrivate::originPosition() const
{
qreal pos = 0;
if (!visibleItems.isEmpty()) {
pos = (*visibleItems.constBegin())->position();
if (visibleIndex > 0)
pos -= visibleIndex * (averageSize + spacing);
}
return pos;
}
qreal QQuickListViewPrivate::lastPosition() const
{
qreal pos = 0;
if (!visibleItems.isEmpty()) {
int invisibleCount = INT_MIN;
int delayRemovedCount = 0;
for (int i = visibleItems.count()-1; i >= 0; --i) {
if (visibleItems.at(i)->index != -1) {
// Find the invisible count after the last visible item with known index
invisibleCount = model->count() - (visibleItems.at(i)->index + 1 + delayRemovedCount);
break;
} else if (visibleItems.at(i)->attached->delayRemove()) {
++delayRemovedCount;
}
}
if (invisibleCount == INT_MIN) {
// All visible items are in delayRemove state
invisibleCount = model->count();
}
pos = (*(--visibleItems.constEnd()))->endPosition();
if (invisibleCount > 0)
pos += invisibleCount * (averageSize + spacing);
} else if (model && model->count()) {
pos = (model->count() * averageSize + (model->count()-1) * spacing);
}
return pos;
}
averageSize
似乎是经过计算的here http://code.qt.io/cgit/qt/qtdeclarative.git/tree/src/quick/items/qquicklistview.cpp#n1286:
void QQuickListViewPrivate::updateAverage()
{
if (!visibleItems.count())
return;
qreal sum = 0.0;
for (int i = 0; i < visibleItems.count(); ++i)
sum += visibleItems.at(i)->size();
averageSize = qRound(sum / visibleItems.count());
}
该函数被调用QQuickListViewPrivate::visibleItemsChanged() http://code.qt.io/cgit/qt/qtdeclarative.git/tree/src/quick/items/qquicklistview.cpp#n767,这被称为QQuickItemViewPrivate::refill() http://code.qt.io/cgit/qt/qtdeclarative.git/tree/src/quick/items/qquickitemview.cpp#n1796,到处都被称为...。基本上每当anything与视图或其项目更改相关。
visibleItems.at(i)->size()
is 几乎相当 http://code.qt.io/cgit/qt/qtdeclarative.git/tree/src/quick/items/qquickitemview_p_p.h#n77 to QQuickItem::width()
/QQuickItem::height()
:
inline qreal itemWidth() const { return item ? item->width() : 0; }
inline qreal itemHeight() const { return item ? item->height() : 0; }
从我所看到的来看,它或多或少需要视图中每个可见项目的高度(可能等同于“当前实例化”),将它们加在一起,然后将该总和除以可见项目的数量。您可以通过添加以下调试输出来确认这一点:
$ git diff
diff --git a/src/quick/items/qquicklistview.cpp b/src/quick/items/qquicklistview.cpp
index 0351077..acfb88a 100644
--- a/src/quick/items/qquicklistview.cpp
+++ b/src/quick/items/qquicklistview.cpp
@@ -1296,6 +1296,7 @@ void QQuickListViewPrivate::updateAverage()
for (FxViewItem *item : qAsConst(visibleItems))
sum += item->size();
averageSize = qRound(sum / visibleItems.count());
+ qDebug() << "sum" << sum << "visibleItems.count()" << visibleItems.count();
}
qreal QQuickListViewPrivate::headerSize() const
单击某个项目之前的输出:
qml: estimated contentHeight 5000
sum 550 visibleItems.count() 11
qml: estimated contentHeight 2500
sum 850 visibleItems.count() 17
按第一项后:
sum 850 visibleItems.count() 15
qml: estimated contentHeight 2845
所以我想说
它不使用当前实例的平均大小。
在某种程度上是不正确的。如果您确实想知道有什么区别,则需要进一步查看代码。