How to run SequentialAnimation in the background?

  • I'm designing Qt5.7/QML application. The main idea is that pressing a button will trigger shell command which takes long time. The results of this command should be reflected in widgets.
    In the meantime, I need SequentialAnimation to run, to show the user that something is happening in the background. So I start the animation and then call the process which sends the shell command.
    But the animation seems to be freezed as the entire GUI until the shell command returns.
    I'm a new comer to Qt/QML/C++ (hardware engineer...).
    Any suggestions? Can you please post the code for the QML/C++/new header?
    QML Code:

    CircularGauge {
        id: speedometer_wr
        x: 199
        y: 158
        value: valueSource.bps
        maximumValue: 400
        width: height
        height: container.height * 0.5
        stepSize: 0
        anchors {
            verticalCenter: parent.verticalCenter
            verticalCenterOffset: 46
        style: DashboardGaugeStyle {}
        NumberAnimation {
            id: animation_wr
            running: false
            target: speedometer_wr
            property: "value"
            easing.type: Easing.InOutSine
            from: 0
            to: 300
            duration: 15000
    Button {
        id: button_benchmark
        x: 168
        y: 26
        width: 114
        height: 47
        text: qsTr("Benchmark")
        tooltip: "Execute the performance test"
        checkable: true
        function handle_becnhmark() {
            speedometer_wr.value = 0;
            // Uncheck the button
            button_benchmark.checked = false;
            // Start the animation
            // Run the benchmark
            var res = backend.run_benchmark();
            // Stop the animation
            speedometer_wr.value = parseFloat(res.split(",")[0]);
        onClicked: {handle_becnhmark()}

    Cpp Code:

    #include <QProcess>
    #include <QtDebug>
    #include "backend.h"
    #include <QRegExp>
    BackEnd::BackEnd(QObject *parent) : QObject(parent)
    QString BackEnd::run_benchmark() {
        qDebug() << "in run_benchmark";
        QProcess proc;
        // Execute shell command
        if (!proc.waitForStarted())
            return "";
        if (!proc.waitForFinished())
            return "";
        // Get the results, parse and return values
         QString result(proc.readAll());
        return result;


    #ifndef BACKEND_H
    #define BACKEND_H
    #include <QObject>
    class BackEnd : public QObject
        explicit BackEnd(QObject *parent = nullptr);
    public slots:
        QString run_benchmark();
    #endif // BACKEND_H

  • @bintuch
    You may run the process in a thread.

  • @Tirupathi-Korla . How to do it? Can you please post example code how to wrap the process as a thread?

  • @bintuch
    When you want to run a process, use some thing like
    QtConcurrent::run(this, & BackEnd::startaProcess);

    and in BackEnd, write

    void startaProcess(){
       // start a process here..

    Go through for Qtconcurrent docs.

Log in to reply

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.