目录
一、QProcess有三种调用方式
设置要运行的命令及参数arguments
QString path = D:/manager.exe
QStringList arguments << D:/text.txt
1.同步调用,阻塞当前程序(如主程序不可点击)
execute()阻塞当前程序,直到外部程序退出
// 创建一个QProcess对象
QProcess process;
// 设置要运行的命令及参数arguments
process.setProgram(path);
process.setArguments(arguments);
// 开始运行进程
process.start();
// 等待进程完成
if (process.waitForFinished(-1)) {
qDebug() << "Process started successfully.";
}
2.异步调用,不会阻塞当前程序,但不会和主程序一起退出
start()不会阻塞当前程序执行
// 创建一个QProcess指针对象
QProcess *process = new QProcess();
// 异步启动外部程序,主程序退出 窗口仍在
process->start(path, arguments);
if (process ->waitForStarted())
qDebug() << "外部程序启动finish。";
else
qDebug() << "外部程序启动error。";*/
3.分离调用,不会阻塞当前程序,但不会和主程序一起退出
startDetached()调用的程序和当前进程脱离关系独立运行
// 第一种方式 传参
bool started = QProcess::startDetached(path, arguments);
// 第二种方式直接启动程序 不需要传参
QProcess * process = new QProcess(this);
bool started = process->startDetached("C:\\Windows\\System32\\notepad.exe");
// 启动是否成功
if (started)
qDebug() << "Process started successfully.";
else
qDebug() << "Failed to start process";
二、异步启用一个程序,随主程序退出而关闭
设置全局指针对象 QProcess * m_process;
// 析构函数
ProcessWidget::~ProcessWidget()
{
// 确保程序退出时关闭所有外部程序
if (m_process) {
if (!(m_process->state() == QProcess::NotRunning)) {
// 将还在运行的程序杀死
m_process->kill();
m_process->waitForFinished(5000);
}
delete m_process;
m_process= NULL;
}
}
ProcessWidget::startProcess()
{
// 传入参数
QStringList arguments;
arguments << "D:/text.txt";
arguments << QString::number(2);
// 外部程序绝对路径
QString path = "D:/manager.exe";
// 先置空 再使用
if (m_process != NULL)
delete m_process;
m_process = new QProcess();
// 异步启动外部程序
m_process->start(path, arguments);
if (m_process->waitForStarted())
qDebug() << "外部程序启动finish。";
else
qDebug() << "外部程序启动error。";*/
}
三、异步启动多个程序,均随主程序退出而关闭
设置全局列表 QList<QProcess *> m_processes;
// 析构函数
ProcessWidget::~ProcessWidget()
{
// 确保程序退出时关闭所有外部程序
foreach(QProcess *process, m_processes) {
if (process) {
if (!(process->state() == QProcess::NotRunning)) {
process->kill();
process->waitForFinished(5000);
}
delete process;
process = NULL;
}
}
}
// 启动外部程序
ProcessWidget::startProcess()
{
// 没有运行则再启动
bool isAgin = true;
foreach(QProcess *process, m_processes) {
if (process) {
if (process->state() == QProcess::NotRunning) {
// 异步启动外部程序
process->start(path, arguments);
if (!process->waitForStarted())
qDebug() << "Process restarted failed.";
isAgin = false;
break;
}
}
}
// 没有/都运行 初始化new
if (isAgin) {
QProcess *process = new QProcess();
m_processes.append(process);
// 异步启动外部程序
process->start(path, arguments);
if (!process->waitForStarted())
qDebug() << "Process started failed.";
}
}