QProcess的finished信号未触发,关联槽函数无法执行问题求助
问题核心原因
- 误用了
QProcess::execute()静态方法:该方法无论是否通过实例调用,都会内部创建独立的QProcess对象执行命令,和你代码中实例化的m_process完全无关。你绑定信号的m_process从未启动过任何进程,自然不会触发finished信号。 - 即使使用正确的启动方法,若在
read()函数内阻塞等待进程结束,当前代码未回到Qt主事件循环,信号也无法正常派发到槽函数。
修复方案
- 替换静态
execute()为实例的非阻塞start()方法,让你自己创建的m_process实例实际运行命令 - 移除多余的
waitForFinished()调用,靠异步信号触发结束逻辑;如果确实需要同步等待,等待完成后手动调用事件派发接口 - 保留一种信号连接方式即可,推荐使用Qt5的函数指针式连接,支持编译期参数校验,比
SIGNAL/SLOT宏更安全
修正后的核心代码示例
void Test::read(){ m_process=new QProcess(this); // 只保留一种连接即可,这里用函数指针写法 connect(m_process, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), [=](int exitCode, QProcess::ExitStatus exitStatus){ qDebug() << "进程结束,退出码:" << exitCode; QByteArray out=m_process->readAllStandardOutput(); qDebug() << "输出:" << out; }); QString program = "lsusb"; QStringList arguments; // 用start而不是execute,让当前m_process实例启动进程 m_process->start(program,arguments); // 不需要waitForFinished,进程结束后会自动触发finished信号回调 qDebug() << "进程已启动,等待异步回调"; return; }
如果必须同步等待进程结束后再返回read(),可以在waitForFinished后加一行事件派发:
m_process->start(program,arguments); if(m_process->waitForFinished()){ // 手动派发当前队列里的所有事件,让finished信号对应的槽立刻执行 QCoreApplication::processEvents(); }
内容的提问来源于stack exchange,提问作者Pj Toopmuch
相关产品推荐
相关产品推荐

