LINUX.ORG.RU

qml изменение состояния state по таймеру

 ,


0

1

Всем привет! Делаю что-то вроде сообщения-напоминалки. Идея такая: есть прямоугольник с изменяемым цветом рамки и толщиной, внутри рамки текст с любым сообщением. Задача, в зависимости от типа сообщения (0,1 или 2) заставить изменяться цвет и толщину рамки у прямоугольника. Для привлечения внимания она должна моргать. Например: State1 - дефолтное состояние (толщина рамки 1, цвет черный) State2 - толщина рамки 3, цвет желтый, частота переключения 200 State3 - толщина рамки 3, цвет красный, частота переключения 100 Вот код:

import QtQuick 2.3
import QtQuick.Controls 1.2
import QtQuick.Layouts 1.1

ApplicationWindow {
    visible: true
    width: 640
    height: 480

    property variant statesNames: ["state1", "state2", "state3"]

    RowLayout {
        TextField {
            id: edit
        }
        Button {
            text: "Ok"
            onClicked: {
                myRect.num_state = statesNames[edit.text];
                myRect.some_text = statesNames[edit.text];
            }
        }
    }

    Test {
        id: myRect
        anchors.centerIn: parent
    }
}

Test.qml

import QtQuick 2.0

Rectangle {
    property alias some_text: text_sqr.text
    property real temp_int: 500
    property alias num_state: myRect.state

    id: myRect
    width: 100; height: 100
    color: "white"
    border.color: "black"
    border.width: 1

    Text {
        id: text_sqr
        text: some_text
        anchors.centerIn: parent
    }

    states: [
        State {
            name: "state1"
            PropertyChanges { target: myRect; border.color: "black"; border.width: 1}
        },
        State {
            name: "state2"
            PropertyChanges { target: myRect; border.color: "orange"; border.width: 5}

        },
        State {
            name: "state3"
            PropertyChanges { target: myRect; border.color: "red"; border.width: 5}
        }
    ]

    Timer {
        id: myTimer
        interval: temp_int
        running: false
        repeat: true
        triggeredOnStart: false
//        onTriggered: (myRect.state == 'state1') ? myRect.state = "" : myRect.state = 'state1';
        Component.onCompleted: start()
    }
}

Как стартануть таймер при изменении state? и как его остановить при State1. И как правильно написать условие в onTriggered? Спасибо)


property real temp_int: 500

Почему real?

running: false
Component.onCompleted: start()

Но зачем? А еще, зачем явно прописывать то, что под дефолту и так false?

Как стартануть таймер при изменении state?

http://doc.qt.io/qt-5/qtqml-syntax-signals.html#property-change-signal-handlers

и как его остановить при State1.

stop() или running = false;

И как правильно написать условие в onTriggered?

Используйте операторы ветвления.

P.S. http://doc.qt.io/qt-4.8/qml-coding-conventions.html

CrossFire ★★★★★
()

Исправил, теперь работает как надо

import QtQuick 2.0

Rectangle {
    property alias some_text: text_sqr.text
    property real temp_int: 500
    property alias num_state: myRect.state
    state: "state1"

    id: myRect
    width: 100; height: 100
    color: "white"
    border.color: "black"
    border.width: 1

    Text {
        id: text_sqr
        text: some_text
        anchors.centerIn: parent
    }

    states: [
        State {
            name: "state1"
            PropertyChanges { target: myRect; border.color: "black"; border.width: 1}
        },
        State {
            name: "state2"
            PropertyChanges { target: myRect; border.color: "orange"; border.width: 5}
            PropertyChanges { target: myTimer; interval: 200}

        },
        State {
            name: "state3"
            PropertyChanges { target: myRect; border.color: "red"; border.width: 5}
            PropertyChanges { target: myTimer; interval: 100}
        }
    ]

    Timer {
        id: myTimer
        interval: temp_int
        running: false
        repeat: true
        triggeredOnStart: false
        onTriggered: (myRect.state == some_text) ? myRect.state = "state1" : myRect.state = some_text;
        Component.onCompleted: start()
    }
}


Но терзают смутные сомнения, что можно как то проще сделать. Причем анимацию не применять.
Less
() автор топика
Ответ на: комментарий от Less

property variant statesNames: [«state1», «state2», «state3»]

myRect.num_state = statesNames[edit.text];

Выкинуть этот кошмар

//Test.qml
    //...
    property string nextState: 'state2'
    //...
    State {
        name: "state2"
        PropertyChanges { target: myRect; nextState: 'state3'}
    //...
    onTriggered: myRect.state = myRect.nextState

И т.д.

ya-betmen ★★★★★
()
Последнее исправление: ya-betmen (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.