• 23687阅读
  • 7回复

[提问]qt下执行system怎样获取cmd输出内容?--已解决 [复制链接]

上一主题 下一主题
离线zy_sunshine
 

只看楼主 正序阅读 楼主  发表于: 2009-12-17
我在windows下用qt编程,想要执行一下cmd命令,如果用

  1. QProcess commandProcess;
  2. commandProcess.start("route", QStringList() << "print");
  3. QByteArray cmdoutput = commandProcess.readAllStandardOutput();
  4. QString txtoutput = cmdoutput;

这样在linux下是可以获取命令输出内容的,但是在windows下就不能了,也不知道执行了没有,返回字符串是空的。
于是我只能用system函数调用cmd命令了。
但是system函数返回的是int型的,而不是屏幕输出字符串。
大家有没有经验在windows下用qt获取返回字符串。请指点一二。
[ 此帖被zy_sunshine在2009-12-20 00:58重新编辑 ]
离线all.us

只看该作者 7楼 发表于: 2013-03-21
引用第5楼dbzhang800于2009-12-19 12:55发表的  :
运行 route、ipconfig 肯定没问题
[code]
    QProcess p(0);
.......

请问我把qDebug()<<Qstring::fromLocal8Bit(p.readAllStandard.Output())放在p.waitForFinished();前时就只有输出了一个" ",这是怎么回事,只能等程序结束才能读到输出吗?
离线zy_sunshine

只看该作者 6楼 发表于: 2009-12-20
感谢,(*^__^*) ……        
头一次用,看assistant没理解正确,谢谢指点
p.waitForStarted();
p.waitForFinished();
离线dbzhang800

只看该作者 5楼 发表于: 2009-12-19
引用第4楼zy_sunshine于2009-12-19 00:04发表的  :
win下用QProcess不能获得像ipconfig dir之类的命令的输出。只能与notpad.exe这样的图形界面的程序交互。


运行 route、ipconfig 肯定没问题
  1.     QProcess p(0);
  2.     p.start("route");
  3.     p.waitForStarted();
  4.     p.waitForFinished();
  5.     qDebug()<<QString::fromLocal8Bit(p.readAllStandardError());


  1.     QProcess p(0);
  2.     p.start("ipconfig");
  3.     p.waitForStarted();
  4.     p.waitForFinished();
  5.     qDebug()<<QString::fromLocal8Bit(p.readAllStandardOutput());


而 dir 是命令行提供的命令,不是程序!

  1.     QProcess p(0);
  2.     p.start("cmd");
  3.     p.waitForStarted();
  4.     p.write("dir\n");
  5.     p.closeWriteChannel();
  6.     p.waitForFinished();
  7.     qDebug()<<QString::fromLocal8Bit(p.readAllStandardOutput());


  1.     QProcess p(0);
  2.     p.start("cmd", QStringList()<<"/c"<<"dir");
  3.     p.waitForStarted();
  4.     p.waitForFinished();
  5.     qDebug()<<QString::fromLocal8Bit(p.readAllStandardOutput());
[ 此帖被dbzhang800在2009-12-19 13:20重新编辑 ]
离线zy_sunshine

只看该作者 4楼 发表于: 2009-12-19
win下用QProcess不能获得像ipconfig dir之类的命令的输出。只能与notpad.exe这样的图形界面的程序交互。
离线zy_sunshine

只看该作者 3楼 发表于: 2009-12-18
好吧,我再测试......上回用QProcess做过,在win下就是不成功,可能我疏忽了什么地方。
离线dbzhang800

只看该作者 2楼 发表于: 2009-12-18
楼主最好还是考虑用 QProcess 吧
离线zy_sunshine

只看该作者 1楼 发表于: 2009-12-18
自问自答了,但是这种方法调用的时候会出现一个cmd的黑框,很不美观。
而且以文件为信息传递中介,效率慢,可不可以将这个文件设置成为内存某区域呢?好像cmd命令和qt交互是两个进程,中间信息传递,内存共享,实现可能性不大(对我来说)。
大家还有没有好的方法,请指点一下。
  1. bool executeCmd(QString commandStr, QRegExp &rx)
  2. {
  3.     QString cmdStr = commandStr+" > cmdInfo.tmp";
  4.     system(cmdStr.toStdString().c_str());
  5.     QFile cmdInfoTmp("cmdInfo.tmp");
  6.     int execute = 0;
  7.     if (!cmdInfoTmp.open(QIODevice::ReadOnly)) {
  8.         return false;
  9.     }else{
  10.         QTextStream stream( &cmdInfoTmp );
  11.         stream.setCodec("ISO-8859-1");// default Winxp code Vista code
  12.         QString line;
  13.         while ( !stream.atEnd() ){
  14.             line = stream.readLine();
  15.             //if(rx.indexIn("项 {f2a062b0-ead1-11de-93dd-08002703cdb6} 成功创建。") != -1){
  16.             if(line.contains(rx)){
  17.                 execute++;
  18.             }
  19.         }
  20.         cmdInfoTmp.close();
  21.     }
  22.     if(execute != 1){
  23.         return false;
  24.     }
  25.     return true;
  26. }
快速回复
限100 字节
 
上一个 下一个