【问题标题】:Interesting task of the processes in QtQt 中进程的有趣任务
【发布时间】:2014-05-14 19:12:31
【问题描述】:

假设我使用 QProcess 运行控制台应用程序。应用程序运行,显示一些信息,然后等待 n 秒并显示其他信息。

我当前的代码是:

QProcess * p = new QProcess();
p->start("test.bat");
p->waitForStarted();
p->waitForFinished();
p->readAll();
delete p;

目前我最后得到了所有的输出,但我需要做的是得到输出并在它可用时显示它。我该怎么做?

【问题讨论】:

  • @AndrewMedico:请不要删除重要标签。
  • 我不同意它们是“重要的”。问题不是关于 qt-coreqt-signals。如果问题及其答案中涉及的每个概念的标签都是适当的,那么几乎每个 Qt 问题都可以用qt-coreqt-signals 进行标签。

标签: c++ qt qtcore qprocess qt-signals


【解决方案1】:

您可以连接到 readyRead() 信号,因此每当有一些数据要读取时,您将继续读取并显示它,而无需等待进程完成。就代码而言,这意味着以下内容:

class Foo : public QObject
{
    Q_OBJECT
public:
    explicit Foo::Foo(QObject parent = Q_NULLPTR)
        : QObject(parent)
    {
        ...
        connect(myProcess, SIGNAL(readyRead()), SLOT(handleReadyRead()));
        connect(myProcess, SIGNAL(finished(int, QProcess::ExitStatus)), SLOT(handleFinished(int, QProcess::ExitStatus)));
        connect(myProcess, SIGNAL(error(QProcess::ProcessError)), SLOT(handleError(QProcess::ProcessError)));
        myProcess.start("test.bat");
        ...
    }

public slots:
    void Foo::handleReadyRead()
    {
        qDebug() << myProcess.readAll();        
    }

    void Foo::handleFinished(int, QProcess::ExitStatus)
    {
        // Handle finished        
    }

    void Foo::handleError(QProcess::ProcessError)
    {
        // Handle error
    }

private:
    QProcess myProcess;
}

免责声明:将其视为伪代码,因为我没有构建它,但它应该演示要使用的概念。

【讨论】:

    猜你喜欢
    • 2016-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-02
    • 1970-01-01
    • 2019-08-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多