qt - 在Qt中杀死一个 QProcess

  显示原文与译文双语对照的内容
0 0

我想知道如何杀死Qt中的QProcess,Linux 。 我启动一个外部应用程序说像显示图像( 全屏)的应用程序,没有标题栏,所以没有关闭按钮。 现在我需要在 5秒后关闭这个应用程序。 我在Qt中怎么做?


void MainWindow::Dialog()
{
. . ....
. . ....
 connect(pbLaunchImage,SIGNAL(released()),this, SLOT(launchImage()));
//I am guessing a connect here to kill the started process
}

void MainWindow::launchImage()
{
 qWarning("Launching Image...");
 p->execute("/usr/bin/fancyImage");
}

编辑:

我还没有发现,但是我找到了一个解决方案,因为我有外部应用程序的源。 我添加了一个退出操作来关闭打开的外部应用程序。 但是如果有人对QProcess有任何了解,请将它的作为答案发布。

时间: 原作者:

0 0

首先,你不能使用 QProcess::execute(...) 插件,因为它是一个块方便方法。 你的Qt程序有效地停止了( 如果它是一个GUI程序,并且它停止了超过一个眼睛的闪烁,那么它就会出现错误) 。 你需要用 QProcess::start(...) 启动这个进程,让你的Qt程序继续运行。


如果子进程行为良好,只需调用 QProcess::terminte() slot 方法使它的退出。 子进程被发送 TERM TERM signal ( 在 linux/unix上),然后它应该干净地退出。

如果进程不良好,并且拒绝按术语退出,则必须使用 QProcess::kill() slot 方法,但是我宁愿修复子应用。

然后,要在 5秒后退出,请使用 QTimer 命令。 在你创建 p的地方,假设它是一个的QProcess,而不是其它东西:


//p = new QProcess... or something equivalent happened here
//below code needs to be done once per creation of `p`

//create a timer with p as parent, so it will be deleted properly
QTimer *killtimer = new QTimer(p); 
killtimer->setTimeout(5000);//5 seconds
killtimer->setSingleShot(true);//should happen only once per process start

//make the timer's timeout to terminate the process
QObject::connect(killtimer, SIGNAL(timeout()), p, SLOT(terminate()));

//make the timer start when process starts
QObject::connect(p, SIGNAL(started()), killtimer, SLOT(start()));

//you also want to connect signals to slots, and at least do debug print
//example:
QObject::connect(p, SIGNAL(started()), this, SLOT(handleStarted()));
QObject::connect(p, SIGNAL(finished(int,QProcess::ExitStatus)), this, SLOT(handleFinished(int,QProcess::ExitStatus)));
QObject::connect(p, SIGNAL(error(QProcess::ProcessError)), this, SLOT(handleError(QProcess::ProcessError)));

//then just launch the process. this program will also keep running
p->start("/usr/bin/fancyImage");

原作者:
...