プログラムが動作するようになりました。以下はコードです。
メインウィンドウ.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
、スロット内にブレーク ポイントを設定すると、エラーを見つけるのに役立ちます。