Running an external program, system command, or shell script from QML

Only a few lines of C++ are needed to expose the Qt QProcess class to QML so that external commands/processes can be run directly from QML:

process.h:
#include <QProcess>
#include <QVariant>

class Process : public QProcess {
    Q_OBJECT

public:
    Process(QObject *parent = 0) : QProcess(parent) { }

    Q_INVOKABLE void start(const QString &program, const QVariantList &arguments) {
        QStringList args;

        // convert QVariantList from QML to QStringList for QProcess 

        for (int i = 0; i < arguments.length(); i++)
            args << arguments[i].toString();

        QProcess::start(program, args);
    }

    Q_INVOKABLE QByteArray readAll() {
        return QProcess::readAll();
    }
};
This class exposes the start and readAll methods to QML; other methods can be exposed similarly if needed. All of QProcess' signals are automatically exposed to QML. To register the Process class with QML, add the following to main():
#include <QtQml>
#include process.h

qmlRegisterType<Process>(Process, 1, 0, Process);
An example of using the Process element in QML:
import QtQuick 2.4
import QtQuick.Controls 1.3
import Process 1.0

ApplicationWindow {
    width: 800
    height: 480
    visible: true

    Text {
        id: text
    }

    Process {
        id: process
        onReadyRead: text.text = readAll();
    }

    Timer {
        interval: 1000
        repeat: true
        triggeredOnStart: true
        running: true
        onTriggered: process.start(/bin/cat, [ /proc/uptime ]);
    }
}

Copyright © 2015 John Temples (qml at xargs dot com)