• Qt之QProcess(一)运行cmd命令


    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"<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关闭程序进程

    开启程序

    1. void MainWindow::on_pushButton_2_clicked()
    2. {
    3. QString file = QFileDialog::getOpenFileName(this,"select exe",QDir::homePath(),"(*.exe)");
    4. qDebug()<<file;
    5. QStringList arguments;
    6. arguments<< "/c" << file;
    7. QProcess cmd(this);
    8. cmd.start("cmd.exe",arguments);
    9. cmd.waitForStarted();
    10. cmd.waitForFinished();
    11. }

    获取pid

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

    杀死进程

    1. void MainWindow::on_pushButton_clicked()
    2. {
    3. QStringList arguments;
    4. arguments<< "/c" << "taskkill" << "/PID" << ui->labpid->text();
    5. QProcess cmd(this);
    6. cmd.start("cmd.exe",arguments);
    7. cmd.waitForStarted();
    8. cmd.waitForFinished();
    9. }

    界面:

    整理后代码:

    将执行代码整合进ExeCmd函数

    1. #include "mainwindow.h"
    2. #include "ui_mainwindow.h"
    3. #include <QProcess>
    4. #include <QDebug>
    5. #include <QFileDialog>
    6. MainWindow::MainWindow(QWidget *parent)
    7. : QMainWindow(parent)
    8. , ui(new Ui::MainWindow)
    9. {
    10. ui->setupUi(this);
    11. }
    12. MainWindow::~MainWindow()
    13. {
    14. delete ui;
    15. }
    16. QStringList MainWindow::ExeCmd(QStringList arguments,bool returnflag)
    17. {
    18. QProcess cmd(this);
    19. cmd.start("cmd.exe",arguments);//这种方式最好,使用cmd程序,运行命令
    20. cmd.waitForStarted();//必须加waitForStarted
    21. cmd.waitForFinished();
    22. if(returnflag == false) {
    23. cmd.close();return QStringList();}
    24. // QString temp=QString::fromLocal8Bit(cmd.readAllStandardOutput());//fromLocal8Bit()函数可以设置编码。处理中文等字符问题
    25. QString temp = cmd.readAll();
    26. QStringList templist = temp.split(QRegExp("\\s+"));//正则表达式'\s+'表示查询除去字符间所有空白后的单词,'\s'只除去单个空白
    27. cmd.close();
    28. return templist;
    29. }
    30. void MainWindow::on_byngetpid_clicked()
    31. {
    32. //获取pid
    33. QStringList arguments;
    34. arguments<< "/c" << "tasklist|findstr" << ui->labexe->text();
    35. QStringList templist = ExeCmd(arguments,true);
    36. // for(auto i:templist) qDebug()<<i;
    37. //"geany.exe" "1100" "Console" "1" "34,968" "K" ""
    38. QString PID = templist.at(1);
    39. ui->labpid->setText(PID);
    40. }
    41. void MainWindow::on_pushButton_clicked()
    42. {
    43. QStringList arguments;
    44. arguments<< "/c" << "taskkill" << "/PID" << ui->labpid->text();
    45. ExeCmd(arguments);
    46. arguments.clear();
    47. arguments<< "/c" << "tasklist|findstr" << ui->labexe->text();
    48. QStringList templist = ExeCmd(arguments,true);
    49. //templist=="",内容长度为 1
    50. if(templist.size()==1)qDebug("kill pid success");
    51. }
    52. void MainWindow::on_pushButton_2_clicked()
    53. {
    54. QString file = QFileDialog::getOpenFileName(this,"select exe",QDir::homePath(),"(*.exe)");
    55. //截取执行的程序名称,找到最后一个'/',得到带.exe的程序名,这里使用section来分段
    56. QString exename = file.section('/',-1,-1);
    57. ui->labexe->setText(exename);
    58. QStringList arguments;
    59. arguments<< "/c" << file;
    60. ExeCmd(arguments);
    61. }

  • 相关阅读:
    打破数据孤岛!时序数据库 TDengine 与创意物联感知平台完成兼容性互认
    图像边缘检测--(Sobel、Laplacian、Canny)
    .NET 高效灵活的API速率限制解决方案
    x6.js 从流程图组件库中拖拽组件到画布dnd使用
    2021年全国研究生数学建模竞赛华为杯A题相关矩阵组的低复杂度计算和存储建模求解全过程文档及程序
    智联招聘的基于 Nebula Graph 的推荐实践分享
    SECS/GEM300协议通讯平台
    JS 数据结构:链表
    猿创征文 | vue设计一个高扩展性能的路由和实现菜单与路由相结合
    面试想吊打面试官?阿里架构师教你吃透Spring(Boot、Cloud、MVC)
  • 原文地址:https://blog.csdn.net/delphigbg/article/details/127781766