[英]QML not registering property change from C++ property
我在自定義QAbstractListItem
子類( 此處實現)的GridView
顯示數據。 添加和刪除項目工作正常,QML會通知更改並且轉換工作正常。
現在我正在嘗試在模型中設置Item的屬性並讓QML對其做出反應。 問題是,沒有調用QML中的onPropertyChanged
。
這是C ++中的屬性:
// item.h
Q_PROPERTY(bool pToBeDeleted READ toBeDeleted NOTIFY toBeDeletedChanged)
// item.cpp
void Item::requestDelete()
{
toBeDeleted_m = true;
qDebug() << "emitting";
emit toBeDeletedChanged();
}
這就是GridView的樣子:
// main.qml
GridView {
id: grid
// ...
model: empty
delegate: customComponent {
toBeDeleted: pToBeDeleted
}
ListModel {
id: empty
}
}
程序啟動時, grid
model
設置為我的itemmodel。
這是QML類型,看不到變化:
// customComponentForm.ui.qml
Item {
property bool toBeDeleted: false
}
// customComponent.qml
CustomComponentForm {
onToBeDeletedChanged: {
console.debug("change")
}
}
現在,當我從模型內部調用方法時,如下所示:
this->items.at(i++)->requestDelete();
輸出顯示emitting
但不change
。
我試圖包括
emit dataChanged(createIndex(i, 0), createIndex(i, 0));
這確實導致onToBeDeletedChanged
有時被調用,但這也導致了一些錯誤的行為與錯誤
DelegateModel::item: index out range 3 3
這里出了兩件事。 首先,因為++ at
this->items.at(i++)->requestDelete();
dataChanged
emit具有錯誤的索引,導致錯誤的項目被更新。 第二,
emit dataChanged(createIndex(i, 0), createIndex(i, 0));
錯過了第三個參數,並且因為在另一次嘗試中我嘗試以錯誤的方式內聯定義Vector,我沒有立即發現這是問題。 這里的正確電話會是
QVector<int> v;
v.append(Qt::UserRole + 7 + 1);
// pToBeDeleted being the 7th property, always check this with
// roleNames()[Qt::UserRole + i + 1]. It should say your property.
emit dataChanged(createIndex(i, 0), createIndex(i, 0), v);
我的錯。
但另一方面,由於角色名稱索引似乎與平台有關,並且表明模型的變化在某種程度上是一種骯臟的方法,更好的解決方案(如Kevin Krammer所建議的)將重寫itemmodel只包含一個屬性,這是QObject
項。 這樣,QML 就會通知更改項目的屬性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.