• 7245阅读
  • 7回复

[提问]使用QProcess读取进程的输出遇到的问题 [复制链接]

上一主题 下一主题
离线yzpdsg
 

只看楼主 倒序阅读 楼主  发表于: 2011-07-20
大家好。我在使用QProcess读取进程的输出时遇到了一个问题。下面是具体的代码:

void MainWindow::showPictInfo(QString fileName)
{
    QString startProgram = "exiv2.exe " + fileName;
    p->start(startProgram);
    connect(p,SIGNAL(finished(int)),this,SLOT(readResult(int)));
}
void MainWindow::readResult(int exitCode)
{
    qDebug()<<"in readResult";
    if(exitCode == 0)
    {
        QTextCodec* gbkCodec = QTextCodec::codecForName("GBK");
        QString result = gbkCodec->toUnicode(p->readAll());
        ui->basicFileInfo->setText(result);
    }
}

在第一次读取时没有问题,正常显示了进程的输出。但是再次读取时却发现readResult()执行了两遍(有两个qDebug()输出),
跟踪调试发现第一遍执行正确获取了信息,第二遍执行就把信息覆盖成空字符串了。这是什么原因造成的呢?
离线uidab

只看该作者 1楼 发表于: 2011-07-20
确保上一次的QProcess已经kill了或者结束了?
有时候为了工作直接获得答案,而我却失去了思考的乐趣!


飘啊飘,何时能安居!
离线yzpdsg

只看该作者 2楼 发表于: 2011-07-20
回 1楼(uidab) 的帖子
我也觉得是这方面的问题,可是

    connect(p,SIGNAL(finished(int)),this,SLOT(readResult(int)));
这句的意思不是等进程finished()后才去读取输出么?这正是我费解的地方

离线uidab

只看该作者 3楼 发表于: 2011-07-20
回 2楼(yzpdsg) 的帖子
看起来是的,你可以在 readResult(int)  这个函数加上一个输出 qDebug  然后看看他输出几次,如果正常应该是结束一次输出一次,如果不是正常那就是输出多次。毕竟一个QProcess如果你调用了一次,只能是有一个结束才对。这是我的理解。
有时候为了工作直接获得答案,而我却失去了思考的乐趣!


飘啊飘,何时能安居!
离线yzpdsg

只看该作者 4楼 发表于: 2011-07-23
回 3楼(uidab) 的帖子
我把p = new QProcess移到了调用函数里,问题解决了。
离线yzpdsg

只看该作者 5楼 发表于: 2011-07-23
回 3楼(uidab) 的帖子
再问一个QProcess::start()的问题:

我从QFileDialog中得到的路径是Unix/Linux下路径的形式,在windows下会有问题。
如在cmd下输入:
C:\Program Files\Kingsoft\WPS Office Personal\office6>cd "C:/Program Files/Kings
oft/WPS Office Personal/office6/"
系统找不到指定的路径。

可是如果改成下面的形式就没问题:
C:\Program Files\Kingsoft\WPS Office Personal\office6>cd "C:\Program Files\Kings
oft\WPS Office Personal\office6"

因此start()就无法打开wps.exe进行处理。

如何将路径中的"/"改成“\”?
离线uidab

只看该作者 6楼 发表于: 2011-07-25
回 5楼(yzpdsg) 的帖子

类似的差不多QDir::toNativeSeparators

有时候为了工作直接获得答案,而我却失去了思考的乐趣!


飘啊飘,何时能安居!
离线yzpdsg

只看该作者 7楼 发表于: 2011-07-25
回 6楼(uidab) 的帖子
OK,谢谢!
快速回复
限100 字节
 
上一个 下一个