27

我想从我的 QT-Programm 中启动一个外部程序。唯一可行的解​​决方案是:

system("start explorer.exe");

但它只适用于 Windows 并启动命令行片刻。

接下来我尝试的是:

QProcess process;
QString file = QDir::homepath + "file.exe";
process.start(file);
//process.execute(file); //i tried as well

但是什么也没发生。有任何想法吗?

4

4 回答 4

31

如果您的process对象是堆栈上的变量(例如,在方法中),则代码将无法按预期工作,因为您已经启动的进程将在QProcess方法完成时的析构函数中被杀死。

void MyClass::myMethod()
{
    QProcess process;
    QString file = QDir::homepath + "file.exe";
    process.start(file);
}

您应该QProcess像这样在堆上分配对象:

QProcess *process = new QProcess(this);
QString file = QDir::homepath + "/file.exe";
process->start(file);
于 2013-10-18T06:20:10.600 回答
8

如果您希望您的程序在进程执行时等待并且只需要获取其退出代码,您可以使用

QProcess::execute(file);
QProcess::exitCode(); // returns the exit code

而不是像这样异步使用进程。

QProcess process;
process.start(file);

请注意,您也可以阻止执行,直到进程完成。为了做到这一点,使用

process.waitForFinished();

该过程开始后。

于 2015-11-17T15:45:43.370 回答
5

QDir::homePath 不以分隔符结尾。exe的有效路径

QString file = QDir::homePath + QDir::separator + "file.exe";
于 2013-10-18T06:00:14.037 回答
5

只需使用QProcess::startDetached; 它是静态的,您不必担心等待它完成或在堆上分配东西或类似的东西:

QProcess::startDetached(QDir::homepath + "/file.exe");

它是 的分离对应物QProcess::execute

从 5.15 开始,该表单已过时(但仍然存在)。新的首选调用与上述相同,但将QStringList命令行参数作为第二个参数。如果您没有要传递的任何参数,只需传递一个空列表。

于 2019-07-27T15:29:36.960 回答