【发布时间】:2020-09-12 04:17:29
【问题描述】:
假设我们有一个模型和两个视图。两个视图使用相同的模型。第二个视图中的项目需要与第一个视图中的相应项目具有相同的宽度。项目之间的宽度不是恒定的。两个视图之间的项目具有相同的索引。
下面的代码生成了两个带有索引的矩形系列作为文本。 view2 的矩形更窄:
import QtQuick 2.15
Rectangle {
ListView {
id: view1
y: 0
height: 50
width: parent.width
model: ts_model
delegate: Rectangle {
width: 60
height: 50
color: "black"
Text {
text: index
color: "white"
}
}
orientation: Qt.Horizontal
layoutDirection: "LeftToRight"
spacing: 5
}
ListView {
id: view2
y: 100
height: 50
width: parent.width
model: ts_model
delegate: Rectangle {
color: "yellow"
width: 50
height: 50
Text {
text: index
}
}
orientation: Qt.Horizontal
layoutDirection: "LeftToRight"
spacing: 5
}
}
让我们尝试将来自view1 的矩形宽度绑定到view2 中的矩形。我希望能够使用view1.itemAtIndex(index) 语法来做到这一点:
ListView {
id: view2
y: 100
height: 50
width: parent.width
model: ts_model
delegate: Rectangle {
color: "yellow"
width: view1.itemAtIndex(index).width
height: 50
Text {
text: index
}
}
(... some more code ...)
不幸的是,这不起作用 - 我得到 TypeError: Cannot read property 'width' of null 有趣的是,它仅对某些项目失败:
我证实:
- 两个视图显示相同数量的元素(相同模型,无过滤)
- 两者的索引都从 0 开始,直到模型中的元素数减一(如两张图片所示)
- 两个索引都是整数
-
view1和view2是同一个父级的子级,我验证他们在通过 id 寻址时可以看到对方
为什么它不起作用?
【问题讨论】:
-
在您调用
itemAtIndex时,view1中的项目可能尚未完全构建。以后调用还行吗? -
@JarMan 好点,虽然我不确定如何确保稍后发生调用
-
例如在窗口的
Component.onCompleted处理程序中调用它。 -
“项目之间的宽度不固定” 为什么?宽度取决于什么?调用
itemAtIndex是一种代码味道,看起来对你来说宽度是模型状态的一部分,不要盯着代表的状态。您需要两个列表独立滚动吗?如果不是,难道你不能同时在一个视图中垂直堆叠两个代表吗? -
@GrecKo 一个项目可以有多个孩子,这些孩子将根据用户请求显示/隐藏,从而改变特定项目的宽度。第二个视图中的相应项目必须更改其宽度以匹配第一个项目,该项目已因用户操作而更改。