簡體   English   中英

使用C ++對象Q_PROPERTY將Checkbox'checked'屬性綁定

[英]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() ,沒有任何反應。 看來復選框的屬性checkedTextEdit組件的行為不同。

我不想以聲明方式綁定我的屬性。 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.

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