绑定复选框'checked'具有C++对象Q_PROPERTY的属性

Binding Checkbox 'checked' property with a C++ object Q_PROPERTY

本文关键字:PROPERTY 属性 具有 复选框 checked 绑定 C++ 对象      更新时间:2023-10-16

我正在学习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;
    }
}