Qt之QProcess(一)运行cmd命令

本文详细介绍了如何在Qt应用中利用QProcess类启动和管理外部程序,包括一体式和分离式启动方式,以及如何处理程序路径含有空格的问题。此外,还展示了如何通过QProcess运行CMD命令,如获取PID和关闭进程,并提供了一个整合的ExeCmd函数示例。示例代码中包含了选择并运行EXE文件,获取其PID以及终止进程的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Qt提供了QProcess类,QProcess可用于完毕启动外部程序,并与之交互通信。

一、启动外部程序的两种方式:
(1)一体式:void QProcess::start(const QString & program, const QStringList & arguments, OpenMode mode = ReadWrite)
外部程序启动后。将随主程序的退出而退出。
(2)分离式:void QProcess::startDetached(const QString & program, const QStringList & arguments, const QString & workingDirectory = QString(), qint64 * pid = 0)
外部程序启动后,当主程序退出时并不退出。而是继续执行。

值得注意的是。当程序路径中含有空格的时候,仅设置程序路径program是无法被识别的。解决方法是再将程序路径传递给arguments。

比如:

//1-不带空格。能够启动
process->start("F:/AppInst/115/115com/115com.exe");

//2-带空格,无法启动
process->start("C:/Program Files/HaoZip/HaoZip.exe");

//3-带空格,使用带參模式。能够启动
process->start("C:/Program Files/HaoZip/HaoZip.exe", QStringList("C:/Program Files/HaoZip/HaoZip.exe"));

二、启动之前须要做的工作:
To start a process, pass the name and command line arguments of the program you want to run as arguments to start(). Arguments are supplied as individual strings in a QStringList.
启动一个外部程序,须要传递外部程序的路径和运行參数。參数用QStringList来带入。

(1)设置路径: void QProcess::setProgram(const QString & program)
(2)设置參数[可选]: void QProcess:: setArguments(const QStringList &
arguments)
(3)启动: void QProcess::start(OpenMode mode =
ReadWrite)

Qt运行cmd命令
界面上添加一个button,一个textedit,一个lineedit

void MainWindow::on_pushButton_clicked()
{
    ui->textEdit->clear();
    QProcess process(this);
    process.setProgram("cmd");
    QStringList argument;
    argument<<"/c"<<ui->lineEdit->text();
    process.setArguments(argument);
    process.start();
    process.waitForStarted(); //等待程序启动
    process.waitForFinished();//等待程序关闭
    QString temp=QString::fromLocal8Bit(process.readAllStandardOutput()); //程序输出信息
    ui->textEdit->setText(temp);
}

注意:直接Process.start(“cmd.exe”)跳不出cmd界面
Process.start(“regedit.exe”)能跳出注册表界面

知识点

  • QProcess进程的使用
    • process.start( 程序,参数指令 )
    • process.waitForStarted()
    • process.waitForFinished()
    • process.close()
  • cmd指令的使用
    • cmd /c 指令

功能

  • 运行选择的程序
  • 获取选择程序的pid
  • 通过taskkill关闭程序进程

开启程序

void MainWindow::on_pushButton_2_clicked()
{

QString file = QFileDialog::getOpenFileName(this,"select exe",QDir::homePath(),"(*.exe)");
qDebug()<<file;
QStringList arguments;
arguments<< "/c" << file;
QProcess cmd(this);
cmd.start("cmd.exe",arguments);
cmd.waitForStarted();
cmd.waitForFinished();
}

获取pid

void MainWindow::on_byngetpid_clicked()
{

//获取pid
QProcess cmd(this);
QStringList arguments;
arguments<< "/c" << "tasklist|findstr" << ui->labexe->text();
cmd.start("cmd.exe",arguments);//这种方式最好,使用cmd程序,运行命令
cmd.waitForStarted();//必须加waitForStarted
cmd.waitForFinished();
// QString temp=QString::fromLocal8Bit(cmd.readAllStandardOutput());//fromLocal8Bit()函数可以设置编码。处理中文等字符问题
QString temp = cmd.readAll();
qDebug()<<temp;
QStringList templist = temp.split(QRegExp("\\s+"));
//正则表达式'\s+'表示查询除去字符间所有空白后的单词,'\s'只除去单个空白
// for(auto i:templist) qDebug()<<i;
//"geany.exe" "1100" "Console" "1" "34,968" "K" ""
QString PID = templist.at(1);
ui->labpid->setText(PID);
}

杀死进程

void MainWindow::on_pushButton_clicked()
{

QStringList arguments;
arguments<< "/c" << "taskkill" << "/PID" << ui->labpid->text();
QProcess cmd(this);
cmd.start("cmd.exe",arguments);
cmd.waitForStarted();
cmd.waitForFinished();
}

界面:

整理后代码:

将执行代码整合进ExeCmd函数

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QProcess>
#include <QDebug>
#include <QFileDialog>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{

ui->setupUi(this);
}
MainWindow::~MainWindow()
{

delete ui;
}
QStringList MainWindow::ExeCmd(QStringList arguments,bool returnflag)
{

QProcess cmd(this);
cmd.start("cmd.exe",arguments);//这种方式最好,使用cmd程序,运行命令
cmd.waitForStarted();//必须加waitForStarted
cmd.waitForFinished();
if(returnflag == false) {
cmd.close();return QStringList();}
// QString temp=QString::fromLocal8Bit(cmd.readAllStandardOutput());//fromLocal8Bit()函数可以设置编码。处理中文等字符问题
QString temp = cmd.readAll();
QStringList templist = temp.split(QRegExp("\\s+"));//正则表达式'\s+'表示查询除去字符间所有空白后的单词,'\s'只除去单个空白
cmd.close();
return templist;
}
void MainWindow::on_byngetpid_clicked()
{

//获取pid
QStringList arguments;
arguments<< "/c" << "tasklist|findstr" << ui->labexe->text();
QStringList templist = ExeCmd(arguments,true);
// for(auto i:templist) qDebug()<<i;
//"geany.exe" "1100" "Console" "1" "34,968" "K" ""
QString PID = templist.at(1);
ui->labpid->setText(PID);
}
void MainWindow::on_pushButton_clicked()
{

QStringList arguments;
arguments<< "/c" << "taskkill" << "/PID" << ui->labpid->text();
ExeCmd(arguments);
arguments.clear();
arguments<< "/c" << "tasklist|findstr" << ui->labexe->text();
QStringList templist = ExeCmd(arguments,true);
//templist=="",内容长度为 1
if(templist.size()==1)qDebug("kill pid success");
}
void MainWindow::on_pushButton_2_clicked()
{

QString file = QFileDialog::getOpenFileName(this,"select exe",QDir::homePath(),"(*.exe)");
//截取执行的程序名称,找到最后一个'/',得到带.exe的程序名,这里使用section来分段
QString exename = file.section('/',-1,-1);
ui->labexe->setText(exename);
QStringList arguments;
arguments<< "/c" << file;
ExeCmd(arguments);
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蝈蝈(GuoGuo)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值