[英]how to assign a listmodel to a QML listview through the QQmlListProperty
[英]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 Image 的缓存属性设置为 false 来解决。 从http://doc.qt.io/qt-5/qquickimageprovider.html的图像缓存部分:
QQuickImageProvider 返回的图像会自动缓存,类似于 QML 引擎加载的任何图像。 当从缓存中加载带有“image://”前缀的图像时,将不会为相关图像提供程序调用 requestImage() 和 requestPixmap()。 如果应该始终从图像提供者获取图像,并且根本不应该缓存图像,请将相关图像的缓存属性设置为 false
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.