Системная команда плагина Qt qml

Я хочу реализовать функцию в пользовательском интерфейсе, созданном в QT. Я хочу, чтобы, когда я нажимаю кнопку из пользовательского интерфейса, приложение отправляло системную команду на машину. Например, когда я нажимаю кнопку, должна выполняться команда sudo systemctl start application.service. Часть файла QML выглядит так:

    ...

    UIPage {
        id: root

        PopupInterface {
            id: popupInterface
            actions: [ { text: "OK" }, { text: "Cancel" } ]
            title: "Settings"

            ...

            onActionTriggered: {
                if (actionId === "0" && !currentState) {


                        Process.start("/bin/cat", [ "/proc/uptime" ]);


                } else if (actionId === "0" && currentState) {


                        Process.start("/bin/cat", [ "/proc/uptime" ]);


                }
                ...
            }
        ...

А это заголовок:

#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();
    }
};

Я нашел там код C++ для системных команд (http://www.xargs.com/qml/process.html), но я не знаю, куда его поместить (файл заголовка), потому что структура проекта пользовательского интерфейса сложна. Я пытаюсь добавить эту функцию в пользовательский интерфейс Neptune (https://github.com/qtproject/qt-apps-neptune-ui/tree/5.10), а файл qml можно найти в sysui/display/FunctionsPage.qml Что нужно сделать, чтобы выполнить системную команду из файла qml?


person DanVison    schedule 27.07.2018    source источник


Ответы (1)


Вы должны зарегистрировать C++ QObject, чтобы сделать его доступным в коде Qml. Это можно сделать с помощью следующего вызова:

qmlRegisterSingletonType<Process>("yourapp.tools", 1, 0, "Process", &createInstance);

Вы можете начать с того, что поместите его в свою функцию main(), возможно, вы сами знаете лучшее место.

Функция createInstance объявлена ​​следующим образом (возможно, вам следует поместить ее где-то в том же файле):

QObject *createInstance(QQmlEngine *eng, QJSEngine *js)
{
    Q_UNUSED(eng)
    Q_UNUSED(js)

    return new Process;
}

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

person Amfasis    schedule 27.07.2018