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"<
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”)能跳出注册表界面
- 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();
- }
- 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);
- }