• Qt 中用QProcess调用cmd命令


    项目做到一定阶段,常常须要在原来的project上调用外部程序。
    Qt为此提供了QProcess类,QProcess可用于完毕启动外部程序,并与之交互通信。

    基本用法:

        QProcess p(0);
        p.start("cmd", QStringList()<<"/c"<<"ping www.baidu.com");
        p.waitForStarted();
        p.waitForFinished();
        QString strTemp=QString::fromLocal8Bit(p.readAllStandardOutput());  //获得输出
    
    //    QMessageBox testMassage;
    //    testMassage.setText(strTemp);
    //    testMassage.exec();
    
    

    另一种用法:

    QProcess p(0);
    QString command = "E:/test_rar_course/rar.exe";
    QStringList args;
    args.append("a");
    args.append("-k");
    args.append("-r");
    args.append("-s");
    args.append("-m1");
    args.append("E:/test_rar_course/test.rar");
    args.append("E:/test_rar_course/direct1/");
    args.append("E:/test_rar_course/direct2/");
    args.append("E:/test_rar_course/test.txt");
    p.execute(command,args);//command是要执行的命令,args是参数
    p.waitForFinished();
    qDebug()<<QString::fromLocal8Bit(p.readAllStandardError());
    
    //p.start(command, args);
    //p.waitForStarted();
    //p.waitForFinished();
    

    注:
    QProcess::start() 接受两个参数,第一个是要执行的命令或者程序,这里就是 notepad.exe;第二个是一个 QStringList 类型的数据,也就是需要传递给这个程序的运行参数。注意,这个程序是需要能够由系统找到的,一般是完全路径。

    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"));
    
    一个完整的例子

    mainwindow.h

    #ifndef MAINWINDOW_H  
    #define MAINWINDOW_H  
     
    #include <QtGui>  
     
    class MainWindow : public QMainWindow  
    {  
        Q_OBJECT  
     
    public:  
        MainWindow(QWidget *parent = 0);  
        ~MainWindow();  
     
    private slots:  
        void openProcess();  
        void readResult(int exitCode);  
     
    private:  
        QProcess *p;  
    };  
     
    #endif // MAINWINDOW_H 
    

    mainwindow.cpp

    #include "mainwindow.h"  
     
    MainWindow::MainWindow(QWidget *parent)  
        : QMainWindow(parent)  
    {  
        p = new QProcess(this);  
        QPushButton *bt = new QPushButton("execute notepad", this);  
        connect(bt, SIGNAL(clicked()), this, SLOT(openProcess()));  
    }  
     
    MainWindow::~MainWindow()  
    {  
     
    }  
     
    void MainWindow::openProcess()  
    {  
        p->start("cmd.exe", QStringList() << "/c" << "dir");  
        connect(p, SIGNAL(finished(int)), this, SLOT(readResult(int)));  
    }  
     
    void MainWindow::readResult(int exitCode)  
    {  
        if(exitCode == 0) {  
            QTextCodec* gbkCodec = QTextCodec::codecForName("GBK");  
            QString result = gbkCodec->toUnicode(p->readAll());  
            QMessageBox::information(this, "dir", result);  
        }  
    }  
    

    在按钮点击的 slot 中,我们通过 QProcess::start() 函数运行了指令:

    cmd.exe /c dir
    

    这里是说,打开系统的 cmd 程序,然后运行 dir 指令。如果有对参数 /c 有疑问,只好去查阅 Windows 的相关手册了哦,这已经不是 Qt 的问题了。然后我们 process 的 finished() 信号连接到新增加的 slot 上面。这个 signal 有一个参数 int。我们知道,对于 C/C++ 程序而言,main() 函数总是返回一个 int,也就是退出代码,用于指示程序是否正常退出。这里的 int 参数就是这个退出代码。在 slot 中,我们检查退出代码是否是0,一般而言,如果退出代码为0,说明是正常退出。然后把结果显示在 QMessageBox 中。怎么做到的呢?原来,QProcess::readAll() 函数可以读出程序输出内容。我们使用这个函数将所有的输出获取之后,由于它的返回结果是 QByteArray 类型,所以再转换成 QString 显示出来。另外注意一点,中文本 Windows 使用的是 GBK 编码,而 Qt 使用的是 Unicode 编码,因此需要做一下转换,否则是会出现乱码的,大家可以尝试一下。

    好了,进程间交互就说这么说,通过查看文档你可以找到如何用 QProcess 实现进程过程的监听,或者是令Qt 程序等待这个进程结束后再继续执行的函数。

    【更多参考】

  • 相关阅读:
    XML操作类
    输入框样式总结
    根据计算机MAC地址限定每台机子只能领取一次账号
    ico图标的应用
    C#实现关机功能
    在sql中实现数组
    JSON
    MvcHtml.ActionLink()用法
    Brettle.Web.NeatUpload.dll 大文件上传
    asp.net 创建Access数据库
  • 原文地址:https://www.cnblogs.com/ZY-Dream/p/10633500.html
Copyright © 2020-2023  润新知