Qt中使用readyReadStandardOutput无法读取输出(Cannot read out

2019-09-21 03:46发布

我使用Qt和我无法得到使用readyReadStandardOutput一个exe文件的输出。

这里是我的代码。

mainwindow.cpp

void MainWindow::on_pushButton_24_clicked()
{
    myprocess = new QProcess(this);
    myprocess->start("files\\helloworld.exe");
    connect(myprocess, SIGNAL(readyReadStandardOutput ()), this, SLOT(outlog()));
}

void MainWindow::outlog()
{
    QString abc;

    abc = myprocess->readAllStandardOutput();

    emit outlogtext(abc);
    ui->lineEdit_4->setText(abc);
}

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QtGui>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    QProcess *myprocess;

signals:
    void outlogtext(QString ver);

private slots:
    void outlog();
private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

该会HelloWorld.exe的只是提供一个输出“Hello World”的,但我不能看到它在文本编辑,什么是错我的代码? 我是很新的Qt的。 谢谢

Answer 1:

我得到了程序的工作。 下面是代码。

mainwindow.hpp

#ifndef MAINWINDOW_HPP
#define MAINWINDOW_HPP

#include <QtGui>

class MainWindow : public QMainWindow
{
Q_OBJECT
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

signals:
    void outlogtext(QString ver);

private slots:
    void outlog();
    void on_pushButton_24_clicked();

private:
    QPushButton* pushButton_24;
    QLineEdit* lineEdit_4;
    QProcess *myprocess;
};

#endif // MAINWINDOW_HPP

main.cpp中

#include <QtCore>
#include <QtGui>
#include <QDebug>
#include "mainwindow.hpp"

MainWindow::MainWindow(QWidget* parent)
  : QMainWindow(parent)
{
    pushButton_24 = new QPushButton;
    connect(pushButton_24, SIGNAL(clicked()),
            this, SLOT(on_pushButton_24_clicked()));

    lineEdit_4 = new QLineEdit;

    QWidget* central = new QWidget;
    QLayout* layout = new QVBoxLayout();
    layout->addWidget(pushButton_24);
    layout->addWidget(lineEdit_4);
    central->setLayout(layout);
    setCentralWidget(central);
}

MainWindow::~MainWindow()
{
}

void MainWindow::on_pushButton_24_clicked()
{
    myprocess = new QProcess(this);
    connect(myprocess, SIGNAL(readyReadStandardOutput()),
            this, SLOT(outlog()));
    myprocess->start("./helloworld.exe");

    // For debugging: Wait until the process has finished.
    myprocess->waitForFinished();
    qDebug() << "myprocess error code:" << myprocess->error();
}

void MainWindow::outlog()
{
    QString abc = myprocess->readAllStandardOutput();
    emit outlogtext(abc);
    lineEdit_4->setText(abc);
}

int main(int argc, char* argv[])
{
   QApplication app(argc, argv);
   MainWindow win;
   win.show();
   return app.exec();
}

helloworld.cpp

#include <iostream>
int main()
{
  std::cout << "Hello World!" << std::endl;
}

有些事情我改变:

  • 构造一个对象后,我总是对象,它可能被调用执行实际操作之前连接信号和槽show()为窗口小部件或调用start()线程。 所以,我可以肯定,我不会错过的信号一样started()例如。

  • 我跑在Linux上的程序。 在那里,我必须确保helloworld.exe是我的道路,我改变了命令./helloworld.exe 。 我没有创建子目录名为files在你的榜样。

  • 在Qt的单独目录的字符是斜线/ 。 有特殊功能的Qt的风格和天然风格之间转换,当你想显示的东西给用户。 在内部总是使用斜线。 这甚至适用于Windows程序(许多控制台命令可以用斜杠代替反斜杠应对,太)。

  • 添加调试输出在开发过程中是真的,真的有价值。 如果未设置Makefile文件正确或东西打破,在helloworld.exe可能会在目录中,其中预计不会结束。 因此,我添加了代码以等待一段时间,直到处理完毕。 这不受伤,因为helloworld.exe需要只是一些毫秒运行。 后来,我打印的错误代码QProcess只是为了确保该程序被发现,可能被执行。 因此,我可以肯定的是,可执行文件是我的道路上,也可执行标志设置,我有权限执行文件等。

我不知道到底是什么原因导致你的机器上的问题。 然而,您的解决方案比较雷,在看看的错误代码QProcess ,并设置槽内破发点,应该可以帮助您找到错误。



文章来源: Cannot read output using readyReadStandardOutput in Qt
标签: qt qt4