QProcess 是 Qt 框架中用于启动和管理外部进程的核心类,允许开发者在应用程序中调用系统命令、执行外部程序或脚本,并与其进行交互。以下是关键点说明及示例:
核心功能
-
启动外部程序
QProcess process; process.start("ls", QStringList() << "-l"); // Linux/macOS 示例 // process.start("dir", QStringList()); // Windows 示例
-
同步/异步执行
- 同步执行(阻塞当前线程):
process.waitForFinished(); // 等待进程结束 QString output = process.readAllStandardOutput();
- 异步执行(推荐,避免界面卡顿):
connect(&process, &QProcess::readyReadStandardOutput, [&](){ QString output = process.readAllStandardOutput(); });
- 同步执行(阻塞当前线程):
-
信号槽机制
connect(&process, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), [](int exitCode, QProcess::ExitStatus status){ if (status == QProcess::NormalExit && exitCode == 0) { qDebug() << "进程正常退出"; } });
常用方法
start(const QString &program, const QStringList &arguments)
启动程序并传递参数(如start("ping", {"-c", "4", "example.com"})
)。write(const QByteArray &data)
向进程输入流写入数据(适用于交互式命令)。kill()
/terminate()
强制终止进程。setWorkingDirectory(const QString &path)
设置工作目录。
注意事项
- 路径问题
- 使用绝对路径或确保程序在系统 PATH 中。
- Windows 需注意
.exe
后缀(如start("notepad.exe")
)。
- 输出处理
- 分别读取标准输出(
readAllStandardOutput
)和错误输出(readAllStandardError
)。 - 避免缓冲区溢出:及时读取数据或通过信号实时处理。
- 分别读取标准输出(
- 编码问题
跨平台时注意输出编码(如 Windows 默认 GBK,需转换为 UTF-8)。
完整示例
#include <QProcess>
#include <QDebug>
int main() {
QProcess process;
process.start("ping", {"-c", "4", "example.com"});
if (!process.waitForStarted()) {
qDebug() << "进程启动失败";
return -1;
}
// 异步读取输出
QObject::connect(&process, &QProcess::readyReadStandardOutput, [&](){
qDebug() << "输出:" << process.readAllStandardOutput();
});
// 进程结束处理
QObject::connect(&process, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished),
[&](int exitCode, QProcess::ExitStatus status){
qDebug() << "退出码:" << exitCode;
qDebug() << "状态:" << (status == QProcess::NormalExit ? "正常" : "异常");
});
return QApplication::exec(); // 保持事件循环运行(GUI 应用需此行)
}
适用场景
- 调用系统命令(如文件操作、网络诊断)。
- 集成第三方工具(如调用 FFmpeg 处理视频)。
- 实现脚本化功能(如批量处理文件)。
建议参考 QProcess Class | Qt Core | Qt 6.9.1 获取最新 API 细节。