我想知道如何在Qt,Linux中杀死QProcess
。我启动一个外部应用程序说像一个显示图像的应用程序(全屏),没有标题栏,所以没有关闭按钮。现在我需要在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");
}
修改
我仍然没有想到它,但我发现了一个解决方法,因为我有外部应用程序的来源。我添加了一个Exit操作,关闭打开的外部应用程序。但如果有人对QProcess有任何想法,请将其作为答案发布。
答案 0 :(得分:0)
首先,你不能使用QProcess::execute(...)
,因为它是一种阻止方便的方法。您的Qt程序会有效停止(错误如果它是一个GUI程序,它会停止超过眨眼)。您需要使用QProcess::start(...)
启动该过程,并让您的Qt程序继续运行。
如果子进程表现良好,只需致电QProcess::terminte() slot method即可退出。子进程发送TERM TERM信号(在Linux / Unix上),然后它应该干净地退出。
如果进程表现不佳,并且拒绝退出TERM,则必须使用QProcess::kill() slot method,但如果可能的话,我宁愿修复子应用程序。
然后,要在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");