Qt插件系统命令qml

时间:2018-07-27 08:58:19

标签: qt qml qmake

我想在QT中制作的UI上实现功能。我希望当我从UI按下按钮时,应用程序应该向计算机发送系统命令。例如,当我单击按钮时,应该执行命令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 ++代码(data),但是我不知道将它放在哪里(头文件),因为UI项目结构很复杂。我正在尝试将此功能添加到Neptune UI(http://www.xargs.com/qml/process.html)中,并且可以在sysui/display/FunctionsPage.qml中找到qml文件,该怎么做才能从qml文件执行系统命令?

1 个答案:

答案 0 :(得分:0)

您应该注册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。但是我认为单例可以满足您的需求