gpt4 book ai didi

c++ - QProcess 无法触发信号 readyRead/readyReadStandardOutput/readyReadStandardError

转载 作者:行者123 更新时间:2023-12-02 10:24:05 57 4
gpt4 key购买 nike

当我运行以下命令时,为什么我永远不会得到 readyRead/readyReadStandardOutput/readyReadStandardError 信号?我在控制台中获得了所有输出。我正在使用 Qt4.8 应用程序来调用 lubuntu 16.04 64bit 中的子进程。这个问题一直困扰着我很长时间。我曾经在 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;
}

最佳答案

根据我的评论,使用 setProcessChannelMode(QProcess::ForwardedChannels)导致以下 behaviour ...

QProcess forwards the output of the running process onto the main process. Anything the child process writes to its standard output and standard error will be written to the standard output and standard error of the main process.



至于为什么这可能会产生各种 readyRead* Windows 上的信号我只能猜测如果父进程实际上没有任何与之关联的控制台(例如 GUI 进程),那么对 setProcessChannelMode 的调用将被忽略,让您使用默认 channel 模式 QProcess::SeparateChannels .

关于输出中额外的双引号,这就是 qDebug适用于某些类型,例如 QByteArray , QString 等如果你想删除引号尝试...
qDebug().noquote() << process->readAllStandardOutput();

关于c++ - QProcess 无法触发信号 readyRead/readyReadStandardOutput/readyReadStandardError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54170201/

57 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com