为 ListModel QML 中的值创建绑定
Create a binding for a value in ListModel QML
我有一个 ListModel 和 ListView,用于显示用户拥有的通知。每次弹出新通知时,ListView 都有一个 add
转换。现在,我想向 ListModel 添加一个时间戳(以分钟为单位)以显示通知的时间,但是由于我在创建通知时向 ListModel 添加了值,所以我必须每分钟手动更新一次模型以更改时间戳,这又触发了我的 add
转换。如何在不每次都重新添加值的情况下更新时间戳?
property int numNotifications: backend_service.num_notifications
onNumNotificationsChanged: {
notificationModel.clear()
for(var x=0; x<numNotifications; x++) {
var notif = backend_service.notifications.get(x);
notificationModel.insert(0, {"name":notif.name, "time":notif.time})
}
}
Rectangle {
height: 500
width: 0.90 * parent.width
anchors {
top: parent
topMargin: 30
left: parent.left
leftMargin: 45
}
ListView {
anchors.fill: parent
model: notificationModel
delegate: notificationDelegate
spacing: 30
add: Transition {
NumberAnimation { property: "opacity"; from: 0; to: 1; duration: 1000 }
}
}
}
ListModel {
id: notificationModel
}
Component {
id: notificationDelegate
Row {
spacing: 20
Text { text: name; color: "white" }
Text { text: time; color: "white" }
}
}
time
是通知以分钟(1 分钟、2 分钟等)多长时间为单位的衡量标准,我必须更新该值。该值在 backend_service
中自动更新,但 ListModel 保留首次添加时的旧值。我想在不更改模型的情况下更新该时间值。有没有办法做到这一点而不必每次都更新模型,也许是通过创建绑定?我也愿意接受其他方法来实现这一目标。
我的建议是模型应该有一个固定的时间戳,而不是一个相对的时间戳。然后您可以选择在视图中相对于当前时间显示它(委托)。
property date now: new Date()
Timer {
running: true
repeat: true
interval: 60 * 1000 // Every minute
onTriggered: {
now = new Date()
}
}
Component {
id: notificationDelegate
Row {
spacing: 20
Text { text: name; color: "white" }
Text {
color: "white"
text: {
var diff = now - time
// Display relative time, something like this...
if (diff > [1 minute]) {
return "1 minute ago"
} else if (diff > [2 minutes]) {
return "2 minutes ago"
}
else ... // etc.
}
}
}
}
我有一个 ListModel 和 ListView,用于显示用户拥有的通知。每次弹出新通知时,ListView 都有一个 add
转换。现在,我想向 ListModel 添加一个时间戳(以分钟为单位)以显示通知的时间,但是由于我在创建通知时向 ListModel 添加了值,所以我必须每分钟手动更新一次模型以更改时间戳,这又触发了我的 add
转换。如何在不每次都重新添加值的情况下更新时间戳?
property int numNotifications: backend_service.num_notifications
onNumNotificationsChanged: {
notificationModel.clear()
for(var x=0; x<numNotifications; x++) {
var notif = backend_service.notifications.get(x);
notificationModel.insert(0, {"name":notif.name, "time":notif.time})
}
}
Rectangle {
height: 500
width: 0.90 * parent.width
anchors {
top: parent
topMargin: 30
left: parent.left
leftMargin: 45
}
ListView {
anchors.fill: parent
model: notificationModel
delegate: notificationDelegate
spacing: 30
add: Transition {
NumberAnimation { property: "opacity"; from: 0; to: 1; duration: 1000 }
}
}
}
ListModel {
id: notificationModel
}
Component {
id: notificationDelegate
Row {
spacing: 20
Text { text: name; color: "white" }
Text { text: time; color: "white" }
}
}
time
是通知以分钟(1 分钟、2 分钟等)多长时间为单位的衡量标准,我必须更新该值。该值在 backend_service
中自动更新,但 ListModel 保留首次添加时的旧值。我想在不更改模型的情况下更新该时间值。有没有办法做到这一点而不必每次都更新模型,也许是通过创建绑定?我也愿意接受其他方法来实现这一目标。
我的建议是模型应该有一个固定的时间戳,而不是一个相对的时间戳。然后您可以选择在视图中相对于当前时间显示它(委托)。
property date now: new Date()
Timer {
running: true
repeat: true
interval: 60 * 1000 // Every minute
onTriggered: {
now = new Date()
}
}
Component {
id: notificationDelegate
Row {
spacing: 20
Text { text: name; color: "white" }
Text {
color: "white"
text: {
var diff = now - time
// Display relative time, something like this...
if (diff > [1 minute]) {
return "1 minute ago"
} else if (diff > [2 minutes]) {
return "2 minutes ago"
}
else ... // etc.
}
}
}
}