QProcess не может запустить сигнал readyRead / readyReadStandardOutput / readyReadStandardError - PullRequest
0 голосов
/ 13 января 2019

Почему я никогда не получаю сигнал readyRead / readyReadStandardOutput / readyReadStandardError при выполнении следующего? я получаю все выходные данные в консоли. я работаю с приложением Qt4.8 для вызова дочернего процесса в lubuntu 16.04 64bit. Эта проблема беспокоила меня в течение длительного времени. работал отлично.

заголовочный файл главного окна:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QProcess>
namespace Ui {
    class MainWindow;
}

class MainWindow : public QMainWindow
{
        Q_OBJECT

    public:
        explicit MainWindow(QWidget *parent = 0);
        ~MainWindow();
        QProcess* process;
    private slots:
        void on_pushButton_clicked();
        void OnRead();
    private:
        Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

источник основного окна:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QProcess>
#include <QDebug>
MainWindow::MainWindow(QWidget* parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    process = new QProcess(this);
    bool result = connect(process, SIGNAL(readyRead()), SLOT(OnRead()));
    qDebug() << result;
    connect(process, SIGNAL(readyReadStandardOutput()), this, SLOT(OnRead()));
    connect(process, SIGNAL(readyReadStandardError()), this, SLOT(OnRead()));
    process->setProcessChannelMode(QProcess::ForwardedChannels);
    process->start("/home/albert/test");
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButton_clicked()
{
}
void MainWindow::OnRead()
{
    qDebug() << "can read";
}

тестовый код здесь:

#include <sys/timerfd.h>
#include <time.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdint.h> /* Definition of uint64_t */
#include <iostream>

int main(int argc, char* argv[])
{
    while (1) {
        std::cout << "hello world!0";
        printf("hello world!\n");
        fprintf(stderr, "hello world error!\n");
        fflush(stdout);
        sleep(1);
    }
    return 0;
}

1 Ответ

0 голосов
/ 13 января 2019

Согласно моему комментарию, использование setProcessChannelMode(QProcess::ForwardedChannels) вызывает следующее поведение ...

QProcess перенаправляет вывод запущенного процесса на главный процесс. Все, что дочерний процесс записывает в свой стандартный вывод и стандартная ошибка будет записана в стандартный вывод и стандартный ошибка основного процесса.

Относительно того, почему это могло генерировать различные сигналы readyRead* в Windows, я могу только догадываться, что если у родительского процесса на самом деле не было какой-либо консоли, связанной с ним (например, процесс GUI), то вызов setProcessChannelMode будет игнорировать, оставляя вас с режимом канала по умолчанию QProcess::SeparateChannels.

Что касается дополнительных двойных кавычек в выводе, это именно то, что qDebug делает для определенных типов, таких как QByteArray, QString и т. Д. Если вы хотите удалить кавычки, попробуйте ...

qDebug().noquote() << process->readAllStandardOutput();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...