C++ QProcess can';t点火信号readyRead/readyReadStandardOutput/readyReadStandardError

C++ QProcess can';t点火信号readyRead/readyReadStandardOutput/readyReadStandardError,c++,qt,C++,Qt,为什么在运行以下命令时从未收到readyRead/readyReadStandardOutput/readyReadStandardError信号?我在控制台中获得所有输出。我正在使用Qt4.8应用程序调用lubuntu 16.04 64位中的子进程。这个问题困扰了我很长时间。我曾经在win7上尝试过相同的代码,它工作得非常好 主窗口头文件: #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #incl

为什么在运行以下命令时从未收到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
\ifndef主窗口
#定义主窗口
#包括
#包括
名称空间用户界面{
类主窗口;
}
类主窗口:公共QMainWindow
{
Q_对象
公众:
显式主窗口(QWidget*parent=0);
~main窗口();
QProcess*过程;
专用插槽:
单击按钮时无效();
void OnRead();
私人:
Ui::MainWindow*Ui;
};
#endif//main窗口
主窗口源:

#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";
}
#包括“mainwindow.h”
#包括“ui_main window.h”
#包括
#包括
主窗口::主窗口(QWidget*父窗口)
:QMainWindow(父级)
,ui(新ui::Main窗口)
{
用户界面->设置用户界面(此);
流程=新的QProcess(此);
bool result=connect(进程、信号(readyRead())、SLOT(OnRead());
qDebug()setProcessChannelMode(QProcess::ForwardedChannels);
过程->开始(“/home/albert/test”);
}
MainWindow::~MainWindow()
{
删除用户界面;
}
void主窗口::在按钮上单击()
{
}
void主窗口::OnRead()
{

qDebug()根据我的评论,使用
setProcessChannelMode(QProcess::ForwardedChannels)
会导致以下情况

QProcess将正在运行的进程的输出转发到主进程 子进程写入其标准输出和 标准错误将写入标准输出和标准 主进程的错误

至于这可能会在Windows上生成各种
readyRead*
信号的原因,我只能猜测,如果父进程实际上没有任何与之关联的控制台(例如GUI进程)然后,对
setProcessChannelMode
的调用将被忽略,留下默认通道模式
QProcess::SeparateChannels

关于输出中额外的双引号,这正是
qDebug
对某些类型(如etc)所做的。如果要删除引号,请尝试

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

因为您有
setProcessChannelMode(QProcess::ForwardedChannels)
。子进程的标准输出和错误将转发到父进程的标准输出和错误。谢谢。删除了setProcessChannelMode(QProcess::ForwardedChannels),它可以工作!当我使用
qDebug()时
qDebug().noquote() << process->readAllStandardOutput();