[英]Binding Checkbox 'checked' property with a C++ object Q_PROPERTY
我正在學習QtQuick,我正在玩C ++類和QML屬性之間的數據綁定。
在我的C ++對象模型中,我有兩個屬性:
Q_PROPERTY(QString name READ getName WRITE setName NOTIFY nameChanged)
Q_PROPERTY(bool status READ getStatus WRITE setStatus NOTIFY statusChanged)
在我的.qml文件中:
TextEdit {
placeholderText: "Enter your name"
text: user.name
}
Checkbox {
checked: user.status
}
當我從我的C ++代碼中使用setName
更改用戶名時,它會自動反映在視圖中。 當我選中/取消選中該復選框,或者當我從C ++代碼調用setStatus()
,沒有任何反應。 看來復選框的屬性checked
與TextEdit
組件的行為不同。
我不想以聲明方式綁定我的屬性。 Qt Quick不支持屬性綁定嗎?
謝謝您的幫助。
正如leemes指出的那樣,用戶單擊復選框會破壞您創建的綁定。 因此,不要創建綁定,而是直接連接到更改信號以處理“get”情況。 使用“onClicked”來處理“set”情況。 此解決方案還需要您在Component.onCompleted()中初始化。 例如...
CheckBox {
id: myCheck
onClicked: user.status = checked
Component.onCompleted: checked = user.status
Connections {
target: user
onStatusChanged: myCheck.checked = user.status
}
}
解決這個問題的方法是通過以下方式恢復onClicked
的綁定(用戶單擊復選框將其刪除):
CheckBox {
checked: user.status
onClicked: {
user.status = checked;
checked = Qt.binding(function () { // restore the binding
return user.status;
});
}
}
如果在調用Component.onCompleted
無法訪問模型,則可以避免出現問題。
我發現使復選框僅在點擊時發出信號更自然,而不是改變其狀態:
// MyCheckBox.qml
CheckBox {
id: control
property bool changeOnClick: true // or just emit clicked()
MouseArea {
anchors.fill: parent
enabled: !control.changeOnClick
onClicked: control.clicked();
}
}
然后你可以綁定一次並在點擊時請求更改源:
MyCheckBox {
changeOnClick: false
checked: user.state
onClicked: {
user.state = !user.state;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.