簡體   English   中英

qt qml 復選框:如何在用戶單擊但未通過 q_property 綁定檢查時執行代碼

[英]qt qml checkbox: How to execute code when clicked by user but not checked by q_property binding

我在 qt 中有一個復選框,我希望通過與代碼相關的 q_property 進行checked ,但也由用戶檢查。 當用戶單擊復選框時,我想運行一些代碼。 問題是當通過代碼和用戶輸入選中復選框時,似乎調用了 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")
    }

您可以實現onToggled信號處理程序。 當用戶通過觸摸、鼠標或鍵盤交互切換可檢查按鈕時,會發出toggled信號。

我在下面假設 robotsStatus.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)
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM