背景
QProcess 类用于启动外部程序并与它们通信,QProcess 将进程视为I/O 设备,可以对进程进行写入和读取。
调用参数设置
①.同时指定路径和参数调用程序
QProcess * process = new QProcess(this);
process->execute("cmd /c ping 127.0.0.1");
②.分别指定路径和参数调用程序
QProcess * process = new QProcess(this);
process->execute("cmd ",QStringList()<<"/c"<<"ping 127.0.0.1");
③.先设置参数再启动
process->setProgram("cmd");
process->setArguments(QStringList() << "/c" << "ping 127.0.0.1");
process->start();
调用外部程序
①.同步调用
使用 execute 会阻塞当前程序执行,直到外部程序退出。
QProcess * process = new QProcess(this);
process->execute("C:\\Windows\\System32\\notepad.exe");
②.异步调用
使用 start 不会阻塞当前程序执行。
QProcess * process = new QProcess(this);
process->start("C:\\Windows\\System32\\notepad.exe");
③.分离调用
使用 startDetached 调用的程序会和当前进程脱离关系独立运行。
QProcess * process = new QProcess(this);
process->startDetached("C:\\Windows\\System32\\notepad.exe");
同步操作函数
①.阻塞至调用成功
if (!process->waitForStarted())
{
//调用失败
}
②.阻塞至有数据读取
if (process->waitForReadyRead())
{
//有数据可读取
}
③.阻塞至程序结束
if (process->waitForStarted())
{
//进程结束
}
和外部程序交互
①.读取外出程序输出
QProcess * process = new QProcess(this);
process->setReadChannel(QProcess::StandardOutput);
process->setProgram("C:\\Windows\\System32\\notepad.exe");
connect(process, &QProcess::readyReadStandardOutput, [process]()
{
std::cout << process->readAllStandardOutput().toStdString();
});
connect(process, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), [&](int exitCode, QProcess::ExitStatus)
{
std::cout << "exited" << std::endl;
});
process->start("cmd /c ping 127.0.0.1");
process->waitForStarted();
②.给外部程序输入数据
QProcess * process = new QProcess(this);
process->setReadChannel(QProcess::StandardOutput);
process->setProgram("C:\\Windows\\System32\\notepad.exe");
connect(process, &QProcess::readyReadStandardOutput, [process]()
{
std::cout << process->readAllStandardOutput().toStdString();
});
connect(process, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), [&](int exitCode, QProcess::ExitStatus)
{
std::cout << "exited" << std::endl;
});
process->start("cmd");
process->waitForStarted();
process->write("ping 127.0.0.1\r\n");
执行 cmd 命令
QProcess 可以直接执行 cmd 命令:
int pid = qApp->applicationPid();
QString killcmd = QString("taskkill /pid %1 /f").arg(pid);
QProcess::startDetached(killcmd);