javascript - qt5 qml timer




Как создать функцию задержки в QML? (2)

Вы можете использовать QtTest

import QtTest 1.0
import QtQuick 2.9

ApplicationWindow{
    id: window

    TestEvent {
        id: test
    }

    function delay_ms(delay_time) {
        test.mouseClick(window, 0, 0, Qt.NoButton, Qt.NoModifier, delay_time)
    }
}

Я хотел бы создать функцию задержки в javascript, которая принимает параметр времени для задержки, чтобы я мог использовать его, вводя задержку между выполнением строк javascript в моем приложении QML. Возможно, это будет выглядеть так:

function delay(delayTime) {
// code to create delay
}

Мне нужно тело функции delay() . Обратите внимание, что setTimeout() javascript не работает в QML.


Как предлагается в комментариях к вашему вопросу, компонент Timer является хорошим решением для этого.

function Timer() {
    return Qt.createQmlObject("import QtQuick 2.0; Timer {}", root);
}

timer = new Timer();
timer.interval = 1000;
timer.repeat = true;
timer.triggered.connect(function () {
    print("I'm triggered once every second");
})

timer.start();

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

function delay(delayTime) {
    timer = new Timer();
    timer.interval = delayTime;
    timer.repeat = false;
    timer.start();
}

(Который ничего не делает; читайте дальше)

Хотя именно то, как вы ищете его для реализации, предполагает, что вы ищете его для блокировки до следующей строки вашей программы. Но это не очень хороший способ сделать это, поскольку он также блокирует все остальное в вашей программе, поскольку JavaScript выполняется только в одном потоке выполнения.

Альтернативой является передача обратного вызова.

function delay(delayTime, cb) {
    timer = new Timer();
    timer.interval = delayTime;
    timer.repeat = false;
    timer.triggered.connect(cb);
    timer.start();
}

Что позволит вам использовать его как таковой.

delay(1000, function() {
    print("I am called one second after I was started.");
});

Надеюсь, поможет!

Редактировать: Выше предполагается, что вы работаете в отдельном файле JavaScript, который вы позже импортируете в свой файл QML. Чтобы сделать эквивалент в файле QML напрямую, вы можете сделать это.

import QtQuick 2.0

Rectangle {
    width: 800
    height: 600

    color: "brown"

    Timer {
        id: timer
    }

    function delay(delayTime, cb) {
        timer.interval = delayTime;
        timer.repeat = false;
        timer.triggered.connect(cb);
        timer.start();
    }

    Rectangle {
        id: rectangle
        color: "yellow"
        anchors.fill: parent
        anchors.margins: 100
        opacity: 0

        Behavior on opacity {
            NumberAnimation {
                duration: 500
            }
        }
    }

    Component.onCompleted: {
        print("I'm printed right away..")
        delay(1000, function() {
            print("And I'm printed after 1 second!")
            rectangle.opacity = 1
        })
    }
}

Я не уверен, что это решение вашей актуальной проблемы, однако; чтобы задержать анимацию, вы можете использовать PauseAnimation .







delay