我有一个shell脚本,当在触摸屏PC(Uubntu Lucid Lynx)上执行时,它会在远程服务器上进行备份。现在,我想通过在其上运行的GUI应用程序中创建一个小Button来实现自动化。该应用程序是使用Qt和C ++构建的。
到目前为止,我可以使用QFileDialog
打开文件夹浏览器并导航到.sh文件,但是是否可以直接打开定义的.sh文件(即通过定义名称和位置)?
有一些提示应该使用QProcess,但我对它的实现感到困惑。提前谢谢。
答案 0 :(得分:5)
您可以运行shell或bash将脚本作为参数传递:
QProcess process;
process.startDetached("/bin/sh", QStringList()<< "/Path/to/myScript.sh");
答案 1 :(得分:4)
您可以将其设为阻止或非阻止。这取决于您是要阻止主进程还是在异步模式下在后台运行shell脚本。
另外,既然你不需要输出,你甚至不需要在这里实例化,只需使用静态方法。
#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";
#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