使用C ++对象Q_PROPERTY将Checkbox'checked'属性绑定

时间:2014-05-25 21:45:02

标签: c++ qt data-binding checkbox qt-quick

我正在学习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不支持属性绑定吗?

感谢您的帮助。

3 个答案:

答案 0 :(得分:8)

正如leemes指出的那样,用户点击复选框会破坏您创建的绑定。因此,不要创建绑定,而是直接连接到更改信号以处理" get"案件。使用" onClicked"处理"设置"案件。此解决方案还需要您在Component.onCompleted()中初始化。例如......

CheckBox {
    id: myCheck
    onClicked: user.status = checked
    Component.onCompleted: checked = user.status
    Connections {
        target: user
        onStatusChanged: myCheck.checked = user.status
    }
}

答案 1 :(得分:3)

解决这个问题的方法是在onClicked中恢复绑定(用户点击复选框删除),类似于:

CheckBox {
    checked: user.status
    onClicked: {
        user.status = checked;
        checked = Qt.binding(function () { // restore the binding
            return user.status;
        });
    }
}

如果您在调用Component.onCompleted时无法访问模型,则可以避免出现问题。

答案 2 :(得分:1)

我发现使复选框仅在单击时发出信号,而不更改其状态更为自然:

// 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;
    }
}