簡體   English   中英

QML沒有從C ++屬性注冊屬性更改

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM