QT:关于QProcess中用write()函数调用cmd.exe进程的方法
一、实验
刚接触Qt两月有余,在实习的地方写写小工具,期间遇到不少问题,要么在网上搜索看CSDN大牛的有关Qt的博客,要么自己看书,虽然浪费了不少时间,还好有点长进,解决了问题。废话不多说,开始正题。
我的小工具中,需要调用在后台调用cmd程序,用Qt实现类似下面的功能,
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();
}
可以运行出结果:
但是我应用这个函数时就不行成功,可能要写参数时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(); //关闭进程
这样就能调用运行成功了,其中有几点切记们也是我走过的弯路,试了很多次才执行成功的;
-
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"这种格式;
- 因为在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,时不成功。先写这么多,以后有问题再补充吧。欢迎讨论。
上一篇: PyQt5基本窗口控件-----QFontDialog
下一篇: 记一次对vue双向绑定的理解