C++ QtProcess::finished()信号没有这样的插槽

C++ QtProcess::finished()信号没有这样的插槽,c++,qt,C++,Qt,我试图运行一个命令行程序,gphoto2从我的Qt应用程序在Linux上运行,并读取它输出到标准输出和标准错误的结果。这个概念验证程序中的GUI是一个按钮和一个标签,用于显示标准错误和标准输出的输出 我无法将QtProcess::Finished信号连接到正确的插槽。我从header、connect语句和函数中的Finished()信号文档中复制了参数列表。函数名的前缀是MainWindow::class标识符。我已经没有东西可以尝试了,我希望StackOverflow的人能够指出这个问题 Th

我试图运行一个命令行程序,gphoto2从我的Qt应用程序在Linux上运行,并读取它输出到标准输出和标准错误的结果。这个概念验证程序中的GUI是一个按钮和一个标签,用于显示标准错误和标准输出的输出

我无法将QtProcess::Finished信号连接到正确的插槽。我从header、connect语句和函数中的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
头文件:
#ifndef主窗口
#定义主窗口
#包括
#包括
#包括
#包括
名称空间用户界面{
类主窗口;
}
类主窗口:公共QMainWindow
{
Q_对象
公众:
显式主窗口(QWidget*parent=0);
~main窗口();
无效回复2();
专用插槽:
单击按钮时无效();
在\u cameraControlExit上无效(int-exitCode,QProcess::ExitStatus-ExitStatus);
私人:
Ui::MainWindow*Ui;
QProcess*摄像机控制;
};
#endif//main窗口
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);

}
#包括“mainwindow.h”
#包括“ui_main window.h”
#包括
#包括
#包括
主窗口::主窗口(QWidget*父窗口):
QMainWindow(父级),
用户界面(新用户界面::主窗口)
{
用户界面->设置用户界面(此);
cameraControl=新的QProcess(此);
}
MainWindow::~MainWindow()
{
删除用户界面;
cameraControl->close();
删除cameraControl;
}
void主窗口::在按钮上单击()
{
//将摄像头控制完成信号连接至将读取退出代码的插槽,然后
//将进程中的std输出字符串放入表单上的标签中
连接(cameraControl,信号(完成(int,QProcess::ExitStatus)),
这个插槽(主窗口::on_cameraControlExit(int-exitCode,QProcess::ExitStatus ExitStatus));
//禁用ui按钮,我们不会重复按下吗
用户界面->按钮->设置禁用(真);
//设置gphoto2参数列表
QStringList-args;
args.append(“--capture image and download”);
//启动相机控制
cameraControl->start(“gphoto2”,参数);
////等待进程完成或30秒,以先到者为准
cameraControl->waitForFinished(30000);
}
void main window::on_cameraControlExit(int exitCode,QProcess::ExitStatus ExitStatus)
{
qDebug()错误字符串();
qDebug()readAllStandardError();
qDebug()readAllStandardOutput();
用户界面->按钮->设置启用(真);
}

我相信以下方法会奏效:

connect(cameraControl, SIGNAL(finished(int , QProcess::ExitStatus )), this, SLOT(on_cameraControlExit(int , QProcess::ExitStatus ))); 连接(cameraControl,SIGNAL(finished(int,QProcess::ExitStatus)),此插槽(在_cameraControlExit(int,QProcess::ExitStatus))上);
我也有同样的问题。我认为这是因为完成的信号函数重载了2个签名,并且编译器很难推断类型:

void finished(int exitCode); 
void finished(int exitCode, QProcess::ExitStatus exitStatus);
以下是我快速而肮脏的解决方法:

1) 打开qprocess.h

2) 评论“较短”的签名:

//  void finished(int exitCode); 
3) 然后将完成的信号连接到lambda插槽:

 QObject::connect(&process, &QProcess::finished, [=](int exitCode, QProcess::ExitStatus exitStatus){
       qDebug() << "finished. Exit code: " + exitCode ;
    });
QObject::connect(&process,&QProcess::finished,[=](int-exitCode,QProcess::ExitStatus-ExitStatus){
qDebug()或使用C++14(现代编译器)

QObject::connect(cameraControl、qOverload(&QProcess::finished)、this和MainWindow::on\u cameraControlExit);
或在:

QObject::connect(cameraControl、static_cast(&QProcess::finished)、this和MainWindow::on_cameraControlExit);

Perfect。我会在stackOverflow允许的情况下尽快给出答案。感谢您的快速响应!您可能还想在\u cameraControlExit上重命名插槽,并删除“on”前缀。为什么我说“is”可能会警告您,如果您使用该前缀命名插槽,它将无法自动连接插槽。单击“on”按钮很好因为它可以自动连接到你的按钮。
QObject::connect(cameraControl, qOverload<int, QProcess::ExitStatus >(&QProcess::finished), this, &MainWindow::on_cameraControlExit);
QObject::connect(cameraControl, static_cast<void(QProcess::*)(int, QProcess::ExitStatus)>(&QProcess::finished), this, &MainWindow::on_cameraControlExit);