QProcess问题,进程的输出 [英] QProcess problems, output of process

查看:19
本文介绍了QProcess问题,进程的输出的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试了解QProcess的用法。我看了Qt文档,但没有运气。
http://doc.qt.io/qt-4.8/qprocess.html

问题示例。

示例1:以下代码正常工作。

    #include <QtCore/QCoreApplication>
#include <QTextStream>
#include <QByteArray>
#include <QProcess>    

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QTextStream qout(stdout);    

    QProcess cmd;
    
    cmd.start("cmd");
    if (!cmd.waitForStarted())  {
        return false;
    }

    cmd.waitForReadyRead();
    QByteArray result = cmd.readAll();
    //qout << result.data() << endl;   //console junk captured, doesn't show. 

    //My test command
    cmd.write("echo hello");
    cmd.write("
");

    //Capture my result
    cmd.waitForReadyRead();
    //This is my command shown by cmd, I don't show it, capture & discard it.
    result = cmd.readLine();
    //Read result of my command ("hello") and the rest of output like cur dir.   
    result = cmd.readAll();    
    qout << result.data();

    qout << "

---End, bye----" << endl;
    return a.exec();
}

上述代码的输出

您好

F:Dev_QtexpControllingExtConsoleApps-build-desktop>

---End, bye----

问题是,如果我尝试通过Qprocess和cmd控制台以这种方式使用ipconfig或7Zip,我无法看到ipconfig或7Zip的任何输出。我不知道是否做了什么,如果做了什么,为什么我看不到输出?下面的代码说明了。

示例2:不起作用。无法使用ipconfig。

#include <QtCore/QCoreApplication>
#include <QTextStream>
#include <QByteArray>
#include <QString>
#include <QProcess>    

int main(int argc, char *argv[])
{
   QCoreApplication a(argc, argv);
   QTextStream qout(stdout);
   
   QProcess cmd2;
    cmd2.setWorkingDirectory("C:/Program Files/7-Zip");   //not needed in this example.
    cmd2.setReadChannel(QProcess::StandardOutput);
    cmd2.setProcessChannelMode(QProcess::MergedChannels);

    cmd2.start("cmd");
    if (!cmd2.waitForStarted())
    {
        qout << "Error: Could not start!" << endl;
        return false;
    }

    cmd2.waitForReadyRead();
    QByteArray result = cmd2.readAll();
    qout << result.data() << endl;      //Console version info, etc.

    //My command
    cmd2.write("ipconfig");
    cmd2.write("
");

    //Capture output of ipconfig command
    //DOES NOT WORK!!
    cmd2.waitForReadyRead();
    while (! cmd2.atEnd())
    {
        result = cmd2.readLine();
        qout << result;
        result.clear();
    }
    qout << endl;

    qout << "

---end----" << endl;
    return a.exec();

}

输出如下所示,缺少ipconfig连接信息结果。根本不捕获ipconfig的输出。

Microsoft Windows XP[版本 5.1.2600](C)版权所有1985-2001 Microsoft Corp.

C:程序文件7-Zip&>ipconfig

-结束-

应该更像这样(使用ipconfig结果)。

Microsoft Windows XP[版本 5.1.2600](C)版权所有1985-2001 Microsoft Corp.

C:文档和 设置 Oname>;ipconfig

Windows IP配置

以太网适配器本地 连接:

    Connection-specific DNS Suffix  . :
    IP Address. . . . . . . . . . . . : 192.172.148.135
    Subnet Mask . . . . . . . . . . . : 255.255.255.0
    Default Gateway . . . . . . . . . : 192.172.148.177
C:文档和设置 Oname>;

显然,输出应该与上面略有不同,但是应该已经捕获了";ipconfig";的输出的连接信息。同样地,如果我尝试通过cmd控制台使用7Zip...我看不到/捕捉不到7ZIP的任何输出。所以我的问题是,我如何通过QProcess和cmd控制台使用ipconfig和7zip等命令行应用程序,并查看这些应用程序的输出结果?

示例3:7Zip不工作

#include <QtCore/QCoreApplication>
#include <QTextStream>
#include <QByteArray>
#include <QProcess>    

int main(int argc, char *argv[])
{
   QCoreApplication a(argc, argv);
   QTextStream qout(stdout);

    QProcess cmd2;
    cmd2.setWorkingDirectory("C:/Program Files/7-Zip");
    cmd2.setReadChannel(QProcess::StandardOutput);
    cmd2.setProcessChannelMode(QProcess::MergedChannels);

    cmd2.start("cmd");
    if (!cmd2.waitForStarted()) {
        return false;
    }

    //My Command
    cmd2.write("7z.exe");
    cmd2.write("
");

    //Capture output of ipconfig command
    cmd2.waitForReadyRead();
    QByteArray result;

    while (! cmd2.atEnd()) {
        result = cmd2.readLine();
        qout << result;
        result.clear();
    }
    qout << endl;

    qout << "

---end----" << endl;
    return a.exec();
}

输出如下。不显示从7ZIP开始的任何内容。

Microsoft Windows XP[版本 5.1.2600](C)版权所有1985-2001 Microsoft Corp.

C:程序文件7-Zip>;7z.exe

-结束-

预计产量将为...

Microsoft Windows XP[版本 5.1.2600](C)版权所有1985-2001 Microsoft Corp.

C:文档和设置 ONAME&>CD C:程序文件7-Zip

C:程序文件7-Zip>;7z.exe

7-Zip 9.15测试版版权所有(C) 1999-2010伊戈尔·巴甫洛夫2010-06-20

用法:7z[...] <;存档名称&>[<;文件名&>...] [<;@list files...>;]

a:添加文件到存档
B:基准d:删除文件 存档e:提取文件 存档(不使用目录 名称)l:列出档案内容
T:测试档案u的完整性: 更新文件以存档x:解压缩 具有完整路径的文件
-ai[r[-|0]]{@list文件|!通配符}:包含档案
-ax[r[-|0]]{@list文件|!通配符}:排除档案-bd:禁用 百分比指标
-i[r[-|0]]{@list文件|!通配符}:包含文件名-m{参数}: 设置压缩方式
-o{目录}:设置输出目录-p{密码}:设置密码-r[-|0]:递归子目录-scs{UTF-8| Win|DOS}:为列表文件设置字符集 -sfx[{name}]:创建sfx存档-si[{name}]:从stdin读取数据-slt:显示l(List)命令的技术信息-so:将数据写入 标准输出-ssc[-]:设置区分大小写 模式-SSW:压缩共享文件
-t{类型}:设置档案-u[-][p#][q#][r#][x#][y#][z#][!newArchiveName]:的类型 更新选项-v{Size}[b|k|m|g]: 创建卷-w[{路径}]:分配 工作目录。空路径表示 临时目录
-x[r[-|0]{@list文件|!通配符}:排除文件名-y:假设启用是 所有查询

C:程序文件7-Zip>;

推荐答案

我看到一个大问题。 在Windows下,您只需按下Enter键即可发布推荐信。正在编写

cmd.write("command");
cmd.write("
");


光写还不够

cmd.write("command");
cmd.write("

");

注意尾部 。试试这个,它应该能更好地工作,我说的更好是指7Zip。我不知道您是否能让ipconfig正常工作。

祝你好运并致以最美好的祝愿
%d

编辑 以下是一个可行的解决方案:


#include <QtCore/QCoreApplication>
#include <QtCore/QProcess>
#include <QtCore/QString>
#include <QtCore/QTextStream>

// Not clean, but fast
QProcess *g_process = NULL;

// Needed as a signal catcher
class ProcOut : public QObject
{
  Q_OBJECT
public:
  ProcOut (QObject *parent = NULL);
  virtual ~ProcOut() {};

public slots:
  void readyRead();
  void finished();
};

ProcOut::ProcOut (QObject *parent /* = NULL */):
QObject(parent)
{}

void
ProcOut::readyRead()
{
  if (!g_process)
    return;

  QTextStream out(stdout);
  out << g_process->readAllStandardOutput() << endl;
}

void
ProcOut::finished()
{
  QCoreApplication::exit (0);
}

int main (int argc, char **argv)
{
  QCoreApplication *app = new QCoreApplication (argc, argv);

  ProcOut *procOut = new ProcOut();
  g_process        = new QProcess();

  QObject::connect (g_process, SIGNAL(readyReadStandardOutput()),
    procOut, SLOT(readyRead()));
  QObject::connect (g_process, SIGNAL(finished (int, QProcess::ExitStatus)),
    procOut, SLOT(finished()));

  g_process->start (QLatin1String ("cmd"));
  g_process->waitForStarted();

  g_process->write ("ipconfig

");

  // Or cmd won't quit
  g_process->write ("exit

");

  int result = app->exec();

  // Allright, process finished.
  delete procOut;
  procOut = NULL;

  delete g_process;
  g_process = NULL;

  delete app;
  app = NULL;

  // Lets us see the results
  system ("pause");

  return result;
}

#include "main.moc"

希望这能有所帮助。它每次都能在我的机器上运行。

这篇关于QProcess问题,进程的输出的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆