Как выполнить консоль python, используя Qt на win10? - PullRequest
0 голосов
/ 18 февраля 2020

Я пытаюсь запустить консоль python с помощью QProcess и показать содержимое консоли в 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 действительно выполняется в соответствии с меткой состояния, показывающей «Процесс запущен ...». Как разрешить вывод python, показанный в QTextEdit? Спасибо.

1 Ответ

0 голосов
/ 18 февраля 2020

Попробуйте:

        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 () читает все доступное до сих пор.

Он помещается в al oop с waitForReadyRead (-1) (-1 означает нет тайм-аута), который будет блокировать, пока что-то не будет доступно для чтения Это делается для того, чтобы все действительно читалось. Простой вызов readAll () после завершения процесса оказался крайне ненадежным (возможно, буфер уже пуст).

...