使用Qt在GUI上按下按钮时启动shell脚本

时间:2014-05-20 17:18:41

标签: c++ linux qt shell qprocess

我有一个shell脚本,当在触摸屏PC(Uubntu Lucid Lynx)上执行时,它会在远程服务器上进行备份。现在,我想通过在其上运行的GUI应用程序中创建一个小Button来实现自动化。该应用程序是使用Qt和C ++构建的。

到目前为止,我可以使用QFileDialog打开文件夹浏览器并导航到.sh文件,但是是否可以直接打开定义的.sh文件(即通过定义名称和位置)?

有一些提示应该使用QProcess,但我对它的实现感到困惑。提前谢谢。

3 个答案:

答案 0 :(得分:5)

您可以运行shell或bash将脚本作为参数传递:

QProcess process;
process.startDetached("/bin/sh", QStringList()<< "/Path/to/myScript.sh");

答案 1 :(得分:4)

您可以将其设为阻止或非阻止。这取决于您是要阻止主进程还是在异步模式下在后台运行shell脚本。

另外,既然你不需要输出,你甚至不需要在这里实例化,只需使用静态方法。

Blocking code

#include <QString>
#include <QFileDialog>
#include <QProcess>
#include <QDebug>

...

// Get this file name dynamically with an input GUI element, like QFileDialog
// or hard code the string here.

QString fileName = QFileDialog::getOpenFileName(this,
tr("Open Script"), "/", tr("Script Files (*.sh)"));

if (QProcess::execute(QString("/bin/sh") + fileName) < 0)
    qDebug() << "Failed to run";

Non-blocking

#include <QString>
#include <QFileDialog>
#include <QProcess>
#include <QDebug>

...

// Get this file name dynamically with an input GUI element, like QFileDialog
// or hard code the string here.

QString fileName = QFileDialog::getOpenFileName(this,
tr("Open Script"), "/", tr("Script Files (*.sh)"));

// Uniform initialization requires C++11 support, so you would need to put
// this into your project file: CONFIG+=c+11

if (!QProcess::startDetached("/bin/sh", QStringList{fileName}))
    qDebug() << "Failed to run";

答案 2 :(得分:3)

使用QProcess::startDetached重载之一:http://qt-project.org/doc/qt-4.8/qprocess.html#startDetached。这是最完整的:

bool QProcess::startDetached ( const QString & program, const QStringList & arguments, const QString & workingDirectory, qint64 * pid = 0 ) [static]

用法示例:

QProcess::startDetached("/.../script", QStringList { "-i", "a.txt", ... });
上面的

QStringList构造函数使用C ++ 11功能。您始终可以使用C ++ 03支持的方式构造QStringList,例如QStringlist list; list << "-i" << "a.txt"; 或者,如果您不需要将任何参数传递给脚本,只需致电QProcess::startDetached("/.../script")

如果您需要接收脚本输出,可以创建QProcess对象并致电start。这里有很好的描述:http://qt-project.org/doc/qt-4.8/qprocess.html#details