【发布时间】:2016-03-29 16:29:01
【问题描述】:
这是 Qt 5.4.0 中的一个问题。并已在 Qt 5.6.0 中修复
我有一个允许用户使用QProcess 启动进程的应用程序。
最初我想将QProcess::finished 信号连接到一个 lambda 函数,但由于它是一个重载函数,由于连接哪个函数不明确,似乎无法完成。
因此,我尝试了监控QProcess的状态变化。
void MainWindow::on_actionLaunchApplication_triggered()
{
// launch the file open dialog for the user to select a file
QString filePath = QFileDialog::getOpenFileName(this, "Select Application to Launch", "/Applications");
if(filePath == "")
return;
QProcess* proc = new QProcess(this);
// can't connect to QProcess::exited with lambda, due to its overloaded function, so will check state changed instead
connect(proc, &QProcess::stateChanged, [filePath, proc, this](QProcess::ProcessState state){
if(state == QProcess::NotRunning)
{
qDebug << "Deleting proc";
disconnect(proc, &QProcess::stateChanged, 0 , 0);
proc->deleteLater();
}
});
proc->start(filePath);
}
通常这会按预期工作;选择的应用程序被执行,并且可以选择不同的应用程序以这种方式一个接一个地运行。退出这样的应用程序会导致执行删除 QProcess 的 tidyup 代码。
但是,如果已使用 QProcess 启动的应用程序退出,然后再次选择执行,则它无法启动,而是立即从 lambda 函数中对 deleteLater 的调用中删除该进程。
那么,发生了什么?考虑到每次都会创建一个新的QProcess,为什么每个应用程序都是第一次工作,但如果这样的应用程序退出并选择再次启动,它会立即被删除?
我完全清楚我可以在没有 lambda 函数或通过 SIGNAL 和 SLOT 宏的情况下连接到 QProcess::finished。这个问题是学术性的,我正在寻找对这里发生的事情的理解。
到目前为止,响应答案和 cmets,看起来这是一个 Qt 错误。连接到QProcess::finished 插槽会导致相同的问题,即仅在第一次启动应用程序。
// launch the file open dialog for the user to select a file
QString filePath = QFileDialog::getOpenFileName(this, "Select Application to Launch", "/Applications");
if(filePath == "")
return;
QProcess* proc = new QProcess();
connect(proc, static_cast<void (QProcess::*)(int)>(&QProcess::finished), [filePath, proc, this](int exitStatus) {
Q_UNUSED(exitStatus);
Log("Deleting proc for launched app");
proc->deleteLater();
proc->disconnect(proc, static_cast<void (QProcess::*)(int)>(&QProcess::finished), 0, 0);
});
proc->start(filePath);
【问题讨论】:
-
你能在
start之后测试proc的状态吗?可能第二次不在同一个初始状态。 -
现在当您说
QProcess::exited时,您的意思是QProcess::finished,对吗?如果是这样,文档显示了如何使用函数指针语法连接到它的示例。 -
@thuga 是的,你是对的,它是
QProcess::finished。感谢您指出这一点。 -
@thuga,更新到 Qt 5.6.0 解决了这个问题。
-
这很有趣。想知道他们改变了什么。