- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我想知道 ListView
如何估计它的 contentItem
的高度/宽度,尽管委托(delegate)是一个 Component
而你不能问,大小可能因一个委托(delegate)实例而异。
即使您知道正确的尺寸,您也无能为力,因为在示例 1 中我们知道正确的 contentHeight
应该是 2500 如果没有按下任何东西,2650 如果有东西被按下。在示例 2 中,正确的 contentHeight
将是 1225,但手动设置该值是没有用的,因为它很快就会被覆盖。
示例 1:
ListView {
id: lv1
width: 200
height: 500
model: 50
onContentHeightChanged: console.log('estimated contentHeight', contentHeight)
delegate: Rectangle {
width: 200
height: ma.pressed ? 150 : 50
border.color: 'black'
Text {
anchors.centerIn: parent
text: index
}
MouseArea {
id: ma
anchors.fill: parent
}
}
}
示例 2:
ListView {
id: lv1
width: 200
height: 500
model: 50
onContentHeightChanged: console.log('estimated contentHeight', contentHeight)
delegate: Rectangle {
width: 200
height: index
border.color: 'black'
Text {
anchors.centerIn: parent
text: index + ' ' + ((index * (index + 1)) / 2)
}
}
}
最佳答案
我不知道。让我们看一下源代码。 :)
查看代码,here's其中设置了 contentWidth
和 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);
}
startPosition()
和 endPosition()
函数声明为 here :
qreal QQuickItemViewPrivate::startPosition() const
{
return isContentFlowReversed() ? -lastPosition() : originPosition();
}
qreal QQuickItemViewPrivate::endPosition() const
{
return isContentFlowReversed() ? -originPosition() : lastPosition();
}
QQuickListView
的 originPosition()
和 lastPosition()
的实现都是 here :
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 :
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()
调用,由 QQuickItemViewPrivate::refill()
调用,这被称为......到处都是。基本上每当与 View 或其项目相关的任何发生变化时。
visibleItems.at(i)->size()
是 pretty much equivalent到 QQuickItem::width()
/QQuickItem::height()
:
inline qreal itemWidth() const { return item ? item->width() : 0; }
inline qreal itemHeight() const { return item ? item->height() : 0; }
据我所知,它或多或少地取了 View 中每个可见项(可能等同于“当前实例化”)的高度,将它们加在一起,然后将该总和除以可见项的数量项目。您可以通过添加以下调试输出来确认这一点:
$ 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
所以我想说
It does not use the average size of the current instances.
在某种程度上是不正确的。如果您真的想知道有什么区别,则需要进一步查看代码。
关于algorithm - QML ListView 如何估计它的 contentItem 的高度/宽度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42780845/
我了解类层次结构和继承的基础知识。因此,我不理解 Watch 窗口为 ContentItem 对象显示的类层次结构。 似乎在说 ContentItem 继承 ContentItem 继承 Conten
以下 Qml 代码提供以下输出(预期): import QtQuick 2.7 import QtQuick.Controls 2.0 import QtQuick.Window 2.11 Windo
当我处于备用 View 时,我知道我可以使用以下方法获取 ContentItem 的显示 URL: @Url.ItemDisplayUrl(contentItem) 但我不知道如何在 Controll
我正在尝试使用以下代码更新特定部分: var nationalPart = _contentManager.Get(Id); nationalPart.Name = part.Name; 我
可以将任意数量的同一类的 ContentItems 添加到 N2 中的页面吗?它们可以嵌套吗? 即有没有办法将 ContentItems 的集合定义为 N2 中的属性?如果可能的话,我还想嵌套这些,以
我想知道 ListView 如何估计它的 contentItem 的高度/宽度,尽管委托(delegate)是一个 Component 而你不能问,大小可能因一个委托(delegate)实例而异。 它
我是一名优秀的程序员,十分优秀!