如何在 Qt4 按钮单击时触发 .sh 文件或 bash 命令?

问题描述

现在,我只有带有按钮的 QML 文件

 /*plasmaComponents.*/ToolButton {
    id: shutdownButton
    text: i18n("Shutdown")
    iconSource: "system-shutdown"
    enabled: power.canShutdown
    onClicked: doTheThing();
}

从阅读 QML 来看,我似乎需要添加一个 C++ 进程。 QML4 可以实现吗?如果没有, QProcess 可以工作吗?如果是这样,哪些文件需要更改?

解决方法

你可以像这样写一个进程执行器类:

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

并注册它们:

#include <QtQml>
#include "process.h"

qmlRegisterType<Process>("Process",1,"Process");

最后从 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("poweroff",[ "-f" ]);
 }

-f 强制立即关机。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...