如何在ListModel中添加元素后更新QML ListView
How to update QML ListView after appending an element into ListModel?
我的QML:中有一个ListView
ListView {
id: listView1
width: parent.width
height: parent.height
interactive: true
clip: true
visible: true
property int elementH: 200
Component.onCompleted: {
mSingals.setPlotList(listView1);
}
function addImage(src) {
listModel.append({"imageSrc": src});
}
function clear() {
listModel.clear();
}
function redraw() {
// ?????
//listView1.update();
}
model: ListModel {
id: listModel
objectName: lModel
}
delegate: Rectangle {
id: delegateItem
width: listView1.width; height: listView1.elementH
color: "blue"
Image {
anchors.left: parent.left
source: imageSrc
visible: true
}
}
}
首先,我使用图像提供程序和函数addImage(src)
:添加一些项目
QVariant qv(QString("image://plots/").append(imageName));
QMetaObject::invokeMethod(plotList, "addImage", Q_ARG(QVariant, qv));
一切正常,ListView
会自动更新。然后我从ListModel
中清除所有项目,并添加一些新项目:
QMetaObject::invokeMethod(plotList, "clear");
QVariant qv(QString("image://plots/").append(someNewImage));
QMetaObject::invokeMethod(plotList, "addImage", Q_ARG(QVariant, qv));
ListView
即使使用以下内容也不会更新:
QMetaObject::invokeMethod(plotList, "redraw");
所以我必须上下滚动几次,使旧元素消失,新元素出现,但无论如何,无论我做什么,20的第一个元素都保持不变
我应该在redraw()
中使用什么来强制更新ListView
?可能以某种方式发出ListModel
的dataChanged
信号?
感谢您的回答!在我的案例中,问题出在图像的名称上。名称保持不变,尽管图像提供程序可以通过这些名称提供新图像,但ListView没有请求新图像。所以现在我只是为每次更新更改名称。
好吧,您不需要做任何事情来获得正确的行为。我想这个问题与用C++做事情有关,这是以阻塞的方式发生的,没有给对象处理事件的时间。
尝试为invokeMethod()
使用排队连接。
QMetaObject::invokeMethod(plotList, "addImage", Qt::QueuedConnection, Q_ARG(QVariant, qv));
然而,从C++访问QML函数意味着"糟糕的设计",你不应该真的这么做,QML应该访问C++,反之亦然。如果你需要用C++编写实际的字符串,你可以使用一个信号,用它发出字符串,并将它连接到QML处理程序,这样你就可以与QML中的模型进行交互。
这应该通过将QML图像的缓存属性设置为false来解决。从的图像缓存部分http://doc.qt.io/qt-5/qquickimageprovider.html:
QQuickImageProvider返回的图像会自动缓存,类似于QML引擎加载的任何图像。当从缓存加载前缀为"image://"的图像时,将不会为相关图像提供程序调用requestImage()和requestPixmap()。如果图像应该始终从图像提供程序获取,并且根本不应该缓存,则将相关图像的缓存属性设置为false
- 有没有办法有效地更新QML中的CAN数据?
- Qml 未收到基类成员变量的更新值
- 从C++更新 QML 文本
- 绑定的 c++ 值在 QML 中未更新
- 从高度动态的C 数据模型中更新QML:计时器与属性绑定
- 从C 推动QML ChartView更新
- QT QML 中的 OpenGL,无法更新屏幕上的图像
- 如何向QML显示不断更新的c++数据
- 使用更新功能扩展QML图像类型
- 是从C 中更新QML梯度值的最佳方法
- 在Qt/QML中的每一帧更新图像时运行时崩溃
- 如何在ListModel中添加元素后更新QML ListView
- QML 绑定未更新
- 在具有多个视图的 QML 中查看、编辑和更新数据(来自C++),而数据保留在C++(订阅数据)中
- 取决于C++函数的 QML 强制绑定更新
- 异步更新QML上的多个QQuickPaintedItem
- QML图像在源更改后未更新
- 如何在QML中更新基于加载器的底部控件
- 在向模型添加新数据后,QML TreeView没有在运行时更新
- (更新)QT QML 5.6 - 什么原因导致此警告"QApplication was not created in the main() thread"?