QProcess是你的朋友。
类似于调用 Windows 命令解释器并同步等待其输出以获取简单目录列表的某些代码的最小版本如下所示:
QProcess process;
process.start("cmd.exe",
QStringList() << "/c" << "dir" << "/b",
QIODevice::ReadWrite | QIODevice::Text);
if(!process.waitForFinished()) // beware the timeout default parameter
qDebug() << "executing program failed with exit code" << process.exitCode();
else
qDebug() << QString(process.readAllStandardOutput()).split('\n');
如果您想异步运行它并获得“在线”结果可能会在 Qt-GUI 应用程序中更新进度条,这会变得更有趣。您将有一个设置部分,例如在您的主表单构造函数中,如下所示:
process = new QProcess(this);
connect( process, SIGNAL(readyReadStandardOutput()), SLOT(onStdoutAvailable()) );
connect( process, SIGNAL(finished(int,QProcess::ExitStatus)), SLOT(onFinished(int,QProcess::ExitStatus)) );
也许在按下按钮的处理程序中调用类似:
process->start("some_command", QStringList() << "some" << "args",
QIODevice::ReadWrite | QIODevice::Text);
if(!process->waitForStarted())
// some_command failed to even start
然后在onStdoutAvailable()插槽中调用process->readAllStandardOutput()并以某种方式对其进行解析以确定您的进度。最后评估连接的finished()信号的exitCode和exitStatus参数以确定是否一切正常(TM)。
如果您希望能够在未经他们同意的情况下停止/终止该进程和所有潜在的子进程并进行跨平台操作,那么它开始变得有趣......但这显然超出了您的问题范围。