天天看點

QML ListView資料修改重新整理問題

1.問題

在QML的ListView控件,再填充資料之後,我們有時候還需要對model中的資料進行更改。可是,對model資料進行修改之後,ListView的資料并沒有及時重新整理出來。甚至有時候forceLayout()也沒有作用。

2.解決辦法

我們可以擷取ListView對象的委托item,通過修改item的屬性及時達到重新整理的目的。

例如QML如下:

ListView {
	id: layer_list;
	objectName: "layer_list";
	anchors.fill: parent;
	clip: true;
	interactive: false;
	model: modelSource;
	spacing: 2;
	delegate: delegateSource;
}       
Component {
	id: delegateSource;
	Rectangle {
		id: wrapper;
		objectName: "delegateSourceItem";               
		
		property string guid: layer_list.model.get(index, 0)
		property string can_layer_see: layer_list.model.get(index, 4);               
		
		Image {
			id: img_see;
			anchors.right: img_lock.left;
			anchors.rightMargin: 7;
			anchors.verticalCenter: parent.verticalCenter;
			width: 12;
			height: 12;
			fillMode: Image.PreserveAspectFit;
			source: can_layer_see == "true" ? "images/can_see.png" : "images/not_see.png";
		}
	}
}
           

當我們修改img_see的資料時,可以通過一下代碼進行修改:

// 動态更新可見性
QQuickItem* content = mpLayerList->property("contentItem").value<QQuickItem*>();
QList<QQuickItem*> list = content->childItems();

for (QQuickItem* item : list) {
std::string on = item->objectName().toStdString();
if (strcmp(on.c_str(), "delegateSourceItem") == 0) {
	std::string tempguid = item->property("guid").toString().toStdString();
	if (strcmp(tempguid.c_str(), guid.c_str()) == 0) {
		item->setProperty("can_layer_see", see.c_str());
		LOG(DEBUG) << "Update Signal Source Visibility,GUID: " << guid << ", See:" << see;
	}
}
}
           

繼續閱讀