我想在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文件执行系统命令?
答案 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。但是我认为单例可以满足您的需求