Qt QProcess::finished() 信号没有这样的插槽

Posted

技术标签:

【中文标题】Qt QProcess::finished() 信号没有这样的插槽【英文标题】:Qt No such slot for the QProcess::finished() signal 【发布时间】:2012-09-21 16:23:59 【问题描述】:

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

我无法将 QtProcess::Finished 信号连接到正确的插槽。我从标头、连接语句和函数中的 Finished() 信号文档中复制了参数列表。函数名称以 MainWindow:: 类标识符为前缀。我已经没有什么可以尝试的了,我希望 *** 中的某个人能够指出问题所在。

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);


【问题讨论】:

【参考方案1】:

或使用 C++14(现代编译器)

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

或者在Qt5 convention:

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

【讨论】:

【参考方案2】:

我相信以下方法会起作用:

连接(cameraControl,SIGNAL(完成(int,QProcess::ExitStatus)),这个,SLOT(on_cameraControlExit(int,QProcess::ExitStatus)));

【讨论】:

完美。只要 *** 允许,我就会把它作为答案。感谢您的快速回复! 另外,您可能需要重命名您的插槽 on_cameraControlExit 并删除 on_ 前缀。为什么我说那是 Qt 可能会警告说,如果你用那个前缀命名你的插槽,它就不能自动连接一个插槽。 on_pushButton_clicked 很好,因为它可以自动将其连接到您的 pushButton。【参考方案3】:

我有同样的问题。我认为这是因为完成的信号函数被 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 ;
    );

【讨论】:

以上是关于Qt QProcess::finished() 信号没有这样的插槽的主要内容,如果未能解决你的问题,请参考以下文章

使用 lambda 函数了解 QProcess 信号的行为

在 Python 3 和 PyQt 中使用 QProcess.finished()

如果子进程崩溃,是不是会发出 QProcess::finished?

将光标更改为沙漏/等待/忙碌光标并返回 Qt

qt实现微信弹出其他选项

28.qt quick-ListView高仿微信好友列表和聊天列表