使用Pigpio库的Qt5中的C ++回调函数

时间:2018-08-14 15:42:50

标签: c++ callback raspberry-pi qt5 gpio

使用C ++ 11将GPIO库与Qt5集成在一起时遇到麻烦。

我想使用此库:http://abyz.me.uk/rpi/pigpio/和Qt来轮询按钮按下情况。

到目前为止,我已经设法将引脚设置为高电平或低电平,但是现在我想使用该库来轮询GPIO状态的变化。我的理解是有限的,但我认为该库使用了回调函数。我收到的错误是

error: no matching function for call to 'gpioSetAlertFunc'
    Note: candidate function not viable: no known conversion fron 'void 
(MainWindow::*)()' to 'gpioAlertFunc_t' (aka 'void(*)(int, int, unsigned 
int)') for 2nd argument

我缺少明显的东西吗?我需要阅读一些特别的东西吗?我的代码附在

非常感谢

piGPIO.h

typedef void (*gpioAlertFunc_t)    (int      gpio,
                                    int      level,
                                    uint32_t tick);

int gpioSetAlertFunc(unsigned user_gpio, gpioAlertFunc_t f);

Main.cpp

#include "mainwindow.h"

#include <pigpio.h>

int main(int argc, char *argv[])
{

    gpioInitialise();
    gpioSetAlertFunc(17, &MainWindow::gpioTest);

    QApplication a(argc, argv);
    MainWindow w;
    w.setWindowFlags(Qt::Window | Qt::FramelessWindowHint);
    w.show();

    return a.exec();
}

MainWindow.h

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

    Ui::MainWindow *ui;

public slots:

    void gpioTest(int gpio, int level, uint32_t tick);

signals:
    .
    .
    .

private slots:
    .
    .
    .

private:
    .
    .
    .    

};

MainWindow.cpp

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    .
    .
    .
}

void MainWindow::gpioTest(int gpio, int level, uint32_t tick){
    //gpioWrite() tested successfully 
    gpioWrite(22,1);
    return;
}

1 个答案:

答案 0 :(得分:1)

问题是您试图绑定到非静态成员函数,但是需要在MainWindow对象上调用gpioTest,因此类型不匹配。有关详情,请参见https://isocpp.org/wiki/faq/pointers-to-members#memfnptr-vs-fnptr。该页面将为您提供一些想法,但是确切的解决方案(例如,静态函数vs包装函数vs std :: invoke等)将特定于您的应用程序需求