6

Linux で実行されている Qt アプリからコマンド ライン プログラム gphoto2 を実行し、標準出力と標準エラーに出力される結果を読み込もうとしています。この概念実証プログラムの GUI は、1 つのプッシュ ボタンと、標準エラーおよび標準出力からの出力を表示するために使用されるラベルです。

QtProcess::Finished シグナルを正しいスロットに接続するのに問題があります。ヘッダー、connect ステートメント、および関数の Finished() シグナル ドキュメントから引数リストをコピーしました。関数名には、MainWindow:: クラス識別子がプレフィックスとして付けられます。試してみることがなくなったので、StackOverflow の誰かが問題を指摘できることを願っています。

The Header file:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QString>
#include <QProcess>
#include <QObject>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

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


private slots:
    void on_pushButton_clicked();
    void on_cameraControlExit(int exitCode, QProcess::ExitStatus exitStatus);


private:
    Ui::MainWindow *ui;
    QProcess* cameraControl;

};

#endif // MAINWINDOW_H

mainwindow.cpp ファイル

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QProcess>
#include <QShortcut>
#include <QDebug>



MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
     cameraControl = new QProcess(this);

}

MainWindow::~MainWindow()
{
    delete ui;
    cameraControl->close();
    delete cameraControl;
}


void MainWindow::on_pushButton_clicked()
{
    // connect the camera control finished signal to the slot that will read the exit code and
    // place the std output string from the process into a label on the form
    connect(cameraControl, SIGNAL(finished(int , QProcess::ExitStatus )),
            this, SLOT(MainWindow::on_cameraControlExit(int exitCode, QProcess::ExitStatus exitStatus)));

    // Disable the ui button do we don't get double presses
    ui->pushButton->setDisabled(true);

    // setup the gphoto2 arguments list
    QStringList args;      
    args.append("--capture-image-and-download");

    // start the camera control
    cameraControl->start("gphoto2",args);

//    // wait for the process to finish or 30 seconds whichever comes first
    cameraControl->waitForFinished(30000);

}



void MainWindow::on_cameraControlExit(int exitCode, QProcess::ExitStatus exitStatus)
{
    qDebug() << cameraControl->errorString();
    qDebug() << cameraControl->readAllStandardError();
    qDebug() << cameraControl->readAllStandardOutput();




    ui->pushButton->setEnabled(true);

}
4

3 に答える 3

5

私は次のことがうまくいくと信じています:

connect(cameraControl、SIGNAL(finished(int、QProcess :: ExitStatus))、this、SLOT(on_cameraControlExit(int、QProcess :: ExitStatus)));
于 2012-09-21T16:29:51.680 に答える
0

同じ問題がありました。終了したシグナル関数が2つのシグネチャでオーバーロードされており、コンパイラが型を推測するのに問題があるために発生すると思います:

void finished(int exitCode); 
void finished(int exitCode, QProcess::ExitStatus exitStatus);

これが私の手っ取り早い回避策です:

1) qprocess.h を開く

2) 「短い」署名にコメントを付けます。

//  void finished(int exitCode); 

3) 次に、finished-signal をラムダ スロットに接続します。

 QObject::connect(&process, &QProcess::finished, [=](int exitCode, QProcess::ExitStatus exitStatus){
       qDebug() << "finished. Exit code: " + exitCode ;
    });
于 2015-10-29T21:44:22.333 に答える