2012-09-21 41 views
3

我想从我在Linux中运行的Qt应用程序运行命令行程序gphoto2,并读取输出到标准输出和标准错误的结果。这个概念验证程序中的GUI是一个单独的按钮和一个标签,用于显示标准错误和标准输出的输出。Qt QProcess :: finished()信号没有这样的插槽

我无法将QtProcess :: Finished信号连接到正确的插槽。我从头文件,连接语句和函数中的Finished()信号文档复制了参数列表。函数名称以MainWindow :: class标识符为前缀。我已经用尽了一切,我希望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

我相信下面的工作:

 
connect(cameraControl, SIGNAL(finished(int , QProcess::ExitStatus)), this, SLOT(on_cameraControlExit(int , QProcess::ExitStatus))); 
+0

完美。只要stackOverflow允许,我会尽快给出答案。感谢您及时的回复! – DarwinIcesurfer

+1

此外,您可能想要重命名您的插槽on_cameraControlExit并删除on_前缀。为什么我说这是Qt可能会警告说,如果您使用该前缀命名您的插槽,它将无法自动连接插槽。 on_pushButton_clicked是很好的,因为它可以自动将它连接到你的pushButton。 – drescherjm

+0

谢谢。建议已实施。 – DarwinIcesurfer

-1

我有同样的问题。我想这是因为完成信号的函数被重载2个签名和编译器的麻烦推断类型:

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

这里是我的快速和肮脏的解决方法:

1)打开qprocess.h

2)注释的 “短” 的签名:

// void finished(int exitCode); 

3)然后与您的拉姆达槽连接完成信号:

QObject::connect(&process, &QProcess::finished, [=](int exitCode, QProcess::ExitStatus exitStatus){ 
     qDebug() << "finished. Exit code: " + exitCode ; 
    }); 
0

还是在Qt5 convention

QObject::connect(cameraControl, static_cast<void(QProcess::*)(int, QProcess::ExitStatus)>(&QProcess::finished), this, &MainWindow::on_cameraControlExit);