5

QT C ++プログラムでPythonインタープリターを使用したかったので、QProcessを使用してPythonコンソールを開こうとしました。

QProcess shell; // this is declared in the class .h file

shell.start("python");
connect(&shell,SIGNAL(readyRead()),SLOT(shellOutput()));
shell.write("print 'hello!'\n");

しかし、私は出力をキャッチしませんでした、どこでそれを間違えましたか、またはこれを行うためのより良い方法はありますか?

4

2 に答える 2

4

私はあなたが期待したことをする非常にミニマルなプログラムを書きました。以下はコードです:

mainwindow.hpp

#ifndef MAINWINDOW_HPP
#define MAINWINDOW_HPP

#include <QtGui>

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

private slots:
    void onReadyRead();
    void onPushButtonClicked();

private:
    QPushButton* pushButton;
    QProcess *shell;
};

#endif // MAINWINDOW_HPP

main.cpp

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

MainWindow::MainWindow(QWidget* parent)
    : QMainWindow(parent)
{
    pushButton = new QPushButton("Execute");
    connect(pushButton, SIGNAL(clicked()),
            this, SLOT(onPushButtonClicked()));
    setCentralWidget(pushButton);
}

void MainWindow::onPushButtonClicked()
{
    shell = new QProcess(this);
    connect(shell, SIGNAL(readyRead()), this, SLOT(onReadyRead()));
    shell->start("python");
    if (!shell->waitForStarted())
        exit(1);

    shell->write("print 'hello!'\n");
    shell->closeWriteChannel();
    if (!shell->waitForFinished())
        exit(1);

    qDebug() << "Shell error code:" << shell->error();
}

void MainWindow::onReadyRead()
{
    QString text = shell->readAll();
    qDebug() << text;
}

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

実装上の注意:

  • を追加して同期APIを使用しましたQProces::waitFor...()
  • で通信チャネルを閉じましたQProcess::closeWriteChannel()
  • いくつかのデバッグ出力を追加しました。特にのエラーコードQProcessは非常に役立ちます。

hello!これらのものは一緒に押しボタンが押されたときにやる気を起こさせることを示しています。

于 2012-08-12T12:58:43.827 に答える
1

何が悪いのかわかりました...

Pythonインタープリターは-i引数で開始する必要があります:python -i

そうしないと、標準の出力と入力に反応しません。

-iなしで何を使っているのか気になります

于 2012-08-20T13:12:57.950 に答える