1

Qt を使用していますが、readyReadStandardOutput を使用して exe ファイルの出力を取得できません。

これが私のコードです。

メインウィンドウ.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);
}

メインウィンドウ.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に非常に慣れていません。ありがとうございました

4

1 に答える 1

3

プログラムが動作するようになりました。以下はコードです。

メインウィンドウ.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.exefilesあなたの例のように呼ばれるサブディレクトリを作成しませんでした。

  • Qt でディレクトリを区切る文字はスラッシュ/です。ユーザーに何かを表示したい場合、Qt スタイルとネイティブ スタイルの間で変換する特別な関数があります。内部的には常にスラッシュを使用します。これは Windows プログラムでも機能します (多くのコンソール コマンドはバックスラッシュの代わりにスラッシュを処理できます)。

  • デバッグ出力を追加することは、開発中に非常に価値があります。Makefile が正しく設定されていないか、何かが壊れている場合、helloworld.exe予期しないディレクトリに配置される可能性があります。したがって、プロセスが完了するまでしばらく待機するコードを追加しました。helloworld.exe実行に数ミリ秒しかかからないため、これは問題ありません。QProcessその後、プログラムが見つかって実行可能であることを確認するために、エラー コードを出力します。したがって、実行可能ファイルがパス上にあること、実行可能フラグが設定されていること、ファイルを実行する権限があることなどを確認できます。

お使いのマシンの問題の原因が正確にはわかりません。ただし、ソリューションを私のソリューションと比較して、エラー コードを確認しQProcess、スロット内にブレーク ポイントを設定すると、エラーを見つけるのに役立ちます。

于 2012-08-12T12:19:36.793 に答える