Как выполнить действие в Qml каждый раз, когда пользователь касается экрана?


Я пишу приложение для встроенного устройства с сенсорным экраном linux, используя Qt и Qml.
Мне нужно реализовать экран блокировки, который появляется после 30 секунд бездействия.
Для этого я реализовал таймер в C++, который изменяет состояние программы после таймаута.

Можно ли обновлять этот таймер в глобальном масштабе каждый раз, когда пользователь касается экрана, так что мне не нужно вызывать слот таймеров start() в каждом осязаемом элементе моей программы?

I также хотелось бы обновить этот таймер, даже когда пользователь касается части экрана, где нет кнопок / интерактивных элементов.

Что-то вроде этого главного.qml:

Rectangle {
    id: mainRect
    width: 800
    height: 480

//something like this (oversimplified) pseudo code:
    onGlobalUserTouch {
        timers.startLockTimer()
    }
//end pseudocode

    Loader {
        id: mainLoader
        anchors.fill: parent
        source: "FirstPage.qml"
        Behavior on opacity {PropertyAnimation{duration:250}}
        onLoaded: secondLoader.source = ""
    }

    states:[
        State {
            name:"SecondPage"
            when: (mainCppClass.state == PanelStates.SECOND_PAGE)
        PropertyChanges {
            target: mainLoader
            source: "SecondPage.qml"
            }
        }
    ]
}
Все, что я смог найти в интернете, - это как реализовать это в iOS или Android.
1 3

1 ответ:

Если mainRect является вашим корневым компонентом, вы можете просто запустить таймер в его области мыши.

 // touch area of your root component
 MouseArea {
     anchors.fill: parent
     onClicked: {
         timers.startLockTimer();
     }
     // child component
     Rectangle {
         color: "yellow"
         x: 50; y : 50
         width: 100; height: 100
     }
 }

Это не отменяет наследственные области мыши. Таким образом, если вы коснетесь области, где нет кнопок/интерактивных элементов, ваш startLockTimer будет вызван.