无法使用Qt中的readyReadStandardOutput读取输出

时间:2012-08-12 09:00:58

标签: qt qt4

我正在使用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”,但我在textEdit中看不到它,我的代码有什么问题?我对Qt很新。谢谢

1 个答案:

答案 0 :(得分:3)

我让程序正常运行。以下是代码。

<强> 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的错误代码并在插槽中设置断点应该可以帮助您找到错误。