欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

QT:关于QProcess中用write()函数调用cmd.exe进程的方法

程序员文章站 2022-03-10 21:45:32
...

一、实验

刚接触Qt两月有余,在实习的地方写写小工具,期间遇到不少问题,要么在网上搜索看CSDN大牛的有关Qt的博客,要么自己看书,虽然浪费了不少时间,还好有点长进,解决了问题。废话不多说,开始正题。

我的小工具中,需要调用在后台调用cmd程序,用Qt实现类似下面的功能,

QT:关于QProcess中用write()函数调用cmd.exe进程的方法

 cmd中写入一个exe可执行文件,后面是可执行文件需要的参数,然后回车就能运行出结果。起初网上搜到的都是用的 myProcess.startDetached(program,arguments);这个函数,其中参数的定义

QString program="cmd.exe";

QStringList arguments;  

然后在网上找到示例程序运行了下,程序如下:

void MainWindow::on_pushButton_clicked()
{
    QProcess myProcess;
    QString program;
    program.append("cmd.exe");
    QStringList arguments;


    arguments<<"/c"<<"ping www.baidu.com";
    myProcess.start(program, arguments);
    myProcess.waitForFinished();
    QString strTemp = QString::fromLocal8Bit(myProcess.readAllStandardOutput());

    QMessageBox testmes;
    testmes.setText(strTemp);
    testmes.exec();
    myProcess.close();

}

可以运行出结果:

QT:关于QProcess中用write()函数调用cmd.exe进程的方法

但是我应用这个函数时就不行成功,可能要写参数时QStringList arguments;  QStringList还没搞清楚怎么使用。

下来就开始尝试用如下格式

    //创建进程,开始执行程序
    QProcess myProcess ;
    myProcess.start("cmd.exe");  //启动cmd
    myProcess.write("E:\\Release\\Console.exe "); //写入exe文件
    myProcess.write("E:\\Qtcode\\023.txt");                      //写入参数 
    myProcess.write("\n\r");                                     //回车
    if(!myProcess.waitForStarted())
    {
        int ret1 = QMessageBox::warning(this, tr("Warning"),tr("启动失败喔~"), QMessageBox::Abort);

    }
    myProcess.waitForFinished();
    qDebug()<<"Error:"<<QString::fromLocal8Bit(myProcess.readAllStandardError());
    myProcess.close();                                          //关闭进程

 这样就能调用运行成功了,其中有几点切记们也是我走过的弯路,试了很多次才执行成功的;

  1. myProcess.write("E:\\Release\\Console.exe ");里面的路径必须是E:\\Release\\Console.exe,这种格式,不能是E:\Release\Console.exe,也不能是E:/Release/Console.exe,Qt 识别的路径格式只能是这种"E:\Release\Console.exe",只不过“\”需要转义,所以要写成"E:\\Release\\Console.exe"这种格式;
  2. 因为在cmd中输入完exe路径后,需要空一格再输入参数路径,所以在myProcess.write()中要注意把空格加上,所以我这句myProcess.write("E:\\Release\\Console.exe  "),后面就多空了一格;

myProcess.write("\n\r");,这句是模仿在cmd敲完命令后回车,我试过好像不加这句也能运行,不过还是加上比较保险。

二、改进

这时候,我需要把myProcess.write("E:\\Release\\Console.exe ");中的路径用参数代替,这其中也是曲曲折折,试了几天才解决,还是太菜了,中间也是拖沓了效率低下,以后做事要提高效率,远离手机,嘿嘿。

开始正题,myProcess.write();中,write()函数里面要求的字符串格式是 QIODevice::write(const char *data),其中QProcess::write()继承的是QIODevice的write(),所以两者是一样的,说白了write()函数字符串要求const char *形式的,我参数使用QString str = "E:\\Release\\Console.exe "; 是QString类型的,需要字符串转换,刚开始我以为 char* 和const char *没有什么区别,就尝试QString->char* 格式,网上可以搜得到,这样我调试好久一直不知道哪里的问题,有点绝望,后来我发现还有QString转 const char * 格式,我再仔细看了下write()函数,才恍然大悟,还是自身基础不好,没有好好查看函数的要求,最后我使用

QString str = "E:\\Release\\Console.exe ";
const char *cstr = str.toLocal8Bit().constData(); 

再将写入函数myProcess.write(cstr);,这样,程序才运行了起来。

补充下,QString 转const char * 涉及到路径问题,QString str需要四个"\",如"E:\\\\Release\\\\Console.exe ", 才可以,我也不知道为什么,因为我尝试E:\\Release\\Console.exe,时不成功。先写这么多,以后有问题再补充吧。欢迎讨论。

 

 

相关标签: Qt