#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, роботом, реализующим исходный объект, и приложением пользовательского интерфейса, реализующим реплику.