флажок qt qml: Как выполнить код при нажатии пользователем, но не проверяется привязкой q_property

#qt #qtquickcontrols

#qt #qtquickcontrols

Вопрос:

У меня есть флажок в qt, который я хотел бы checked установить через q_property, привязанный к коду, но также и пользователем. Когда пользователь нажимает на флажок, я хотел бы запустить некоторый код. Проблема в том, что обратный вызов onChecked, похоже, вызывается, когда флажок установлен с помощью кода, а также пользовательского ввода. Этот код будет включать флажок checked , установленный кодом позже, что вызовет обратный вызов onChecked. Как лучше всего справиться с этой ситуацией с помощью обратных вызовов, предоставляемых Qt?

Для получения дополнительной информации, если вышесказанное не имеет смысла: этот флажок управляет функцией робота через сетевое соединение, но он также должен показывать состояние функции, поскольку она может быть включена автоматически или из предыдущего сеанса. Свойство q_property robotStatus.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")
    }
 

Ответ №1:

Вы можете реализовать onToggled обработчик сигналов. toggled сигнал выдается, когда пользователь интерактивно переключает проверяемую кнопку с помощью касания, мыши или клавиатуры.

Я предполагаю, что robotStatus.missionLooping является свойством только для чтения. Вам нужен Q_INVOKABLE метод или функция слота для вызова, например robotApi.loopMission(bool) , который вызывает robot по сети и, в свою очередь, вызывает изменение свойства robotStatus.missionLooping на true / false при запуске / остановке цикла.

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

Комментарии:

1. Если robot также реализован в Qt, ваш вариант использования был бы идеальным для реализации с удаленными объектами Qt, роботом, реализующим исходный объект, и приложением пользовательского интерфейса, реализующим реплику.