QProcess 无法触发信号readyRead/readyReadStandardOutput/readyReadStandardError

问题描述 投票:0回答:2

为什么当我运行以下命令时,我永远不会收到readyRead/readyReadStandardOutput/readyReadStandardError信号?我在控制台中得到了所有输出。我正在使用 Qt4.8 应用程序来调用 lubuntu 16.04 64 位中的子进程。这个问题已经困扰我很长时间了。我曾经在 win7 上尝试过相同的代码,它工作完美。

主窗口头文件:

#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;
}
c++ qt
2个回答
1
投票

根据我的评论,使用

setProcessChannelMode(QProcess::ForwardedChannels)
会导致以下 行为...

QProcess 将正在运行的进程的输出转发到主进程 过程。子进程写入其标准输出的任何内容以及 标准错误将被写入标准输出和标准 主流程错误。

至于为什么这可能会在 Windows 上生成各种

readyRead*
信号,我只能猜测,如果父进程实际上没有任何与之关联的控制台(例如 GUI 进程),那么对
setProcessChannelMode
的调用将被忽略留给您默认的通道模式
QProcess::SeparateChannels

关于输出中额外的双引号,这正是

qDebug
对某些类型的作用,例如
QByteArray
QString
等。如果您想删除引号,请尝试...

qDebug().noquote() << process->readAllStandardOutput();

0
投票

我遇到了类似的问题,但我在线程中启动 QProcess,因此没有触发 readRead 。将创建移至主进程,现在可以工作了

© www.soinside.com 2019 - 2024. All rights reserved.