首页 > 解决方案 > qt qml 复选框:当用户单击但未通过 q_property 绑定检查时如何执行代码

问题描述

我在 qt 中有一个复选框,我想checked通过与代码绑定的 q_property 来使用它,但也可以由用户使用。当用户单击复选框时,我想运行一些代码。问题是,当通过代码和用户输入检查复选框时,似乎调用了 onChecked 回调。此代码将涉及checked稍后由代码生成的复选框,这将触发 onChecked 回调。Qt 提供的回调如何最好地处理这种情况?

如果上述内容没有意义,请获取更多背景信息:此复选框通过网络连接控制机器人上的功能,但它还应显示该功能的状态,因为它可以自动启用或从以前的会话启用。q_propertyrobotStatus.missionLooping由定期状态更新设置。当用户选中该框时,它应该触发网络调用以启用该功能,然后状态更新将在稍后发生,这将看到该功能已启用并选中该框(即使它已经被选中)。

AppCheckBox.qml:

import QtQuick 2.15
import QtQuick.Controls 2.15

CheckBox
{
    id: root

    indicator: Rectangle
    {
        implicitWidth: utilities.dp(40)
        implicitHeight: utilities.dp(40)
        x: root.leftPadding
        y: parent.height / 2 - height / 2

        Rectangle
        {
            width: utilities.dp(20)
            height: utilities.dp(20)
            x: utilities.dp(10)
            y: utilities.dp(10)
            radius: utilities.dp(3)
            color: theme.green
            visible: root.checked
        }
    }

    contentItem: Text
    {
        text: root.text
        font: root.font
        opacity: enabled ? 1.0 : 0.3
        color: theme.white
        verticalAlignment: Text.AlignVCenter
        leftPadding: root.indicator.width + root.spacing
        //font.pointSize: constants.coordinatesTextPointSize + 1
        minimumPointSize: constants.minimalCoordinatesTextPointSize
    }
}

ui.qml:

    AppCheckBox
    {
        id: missionLoopingCheckbox
        enabled: isConnected
        checked: robotStatus.missionLooping
        text: qsTr("Mission Looping")
    }

标签: qtqtquickcontrols

解决方案


您可以实现onToggled信号处理程序。toggled当用户通过触摸、鼠标或键盘交互切换可检查按钮时,会发出信号。

我在下面假设 robotStatus.missionLooping 是只读属性。您需要Q_INVOKABLE调用方法或槽函数,例如robotApi.loopMission(bool)通过网络调用机器人,进而导致robotStatus.missionLooping 属性在循环开始/停止时更改为真/假。

AppCheckBox
{
    id: missionLoopingCheckbox
    enabled: isConnected
    checked: robotStatus.missionLooping
    text: qsTr("Mission Looping")
    onToggled: {
        robotApi.loopMission(missionLoopingCheckbox.checked)
    }
}

推荐阅读