0

我正在尝试使用 QProcess 执行 python 控制台并在 QTextEdit 中显示控制台的内容。以下是我的主要代码:

    connect(&process, SIGNAL(readyReadStandardOutput()), this, SLOT(PrintStandardOutput()));
    connect(&process, SIGNAL(started()), this, SLOT(Started()));
    ...
    void Widget::PrintStandardOutput()
    {
        QString stdOtuput = QString::fromLocal8Bit(process.readAllStandardOutput());
        ui->textEdit_Output->append(stdOtuput);
    }

    void Widget::Started()
    {
        ui->stateLabel->setText("Process started...");
    }


我曾经QProcess::start("python")启动一个新进程并QProcess::write()编写我的python代码,但我的QTextEdit中什么也看不到,顺便说一句,python进程确实是根据显示“进程启动...”的stateLabel执行的。如何让 QTextEdit 中显示的 python 输出?谢谢。

4

1 回答 1

0

尝试 :

        connect(&process, SIGNAL(readyReadStandardOutput()), this, SLOT(PrintStandardOutput()));

        connect(&process, SIGNAL(started()), this, SLOT(Started()));

        process.setProcessChannelMode(QProcess::MergedChannels);
        process.start(processToStart, arguments)

        void Widget::PrintStandardOutput()
        {

            // Get the output
            QString output;
            if (process.waitForStarted(-1)) {
                while(process.waitForReadyRead(-1)) {
                    output += process.readAll();
                    ui->textEdit_Output->append(output);
                }
            }
            process.waitForFinished();
        }

        void Widget::Started()
        {
        ui->stateLabel->setText("Process started...");
        }

setProcessChannelMode(QProcess::MergedChannels)将合并输出通道。各种程序写入不同的输出。有些使用错误输出进行正常日志记录,有些使用“标准”输出,有些则两者兼而有之。最好合并它们。

readAll()读取目前可用的所有内容。

它被放入一个带有 waitForReadyRead(-1) 的循环中(-1 表示没有超时),这将阻塞直到有东西可供读取。这是为了确保所有内容都被实际读取。在进程完成后简单地调用 readAll() 被证明是非常不可靠的(缓冲区可能已经是空的)。

于 2020-02-18T08:36:06.853 回答