Функция обратного вызова С++ в Qt5 с библиотекой pigpio

У меня возникли проблемы с объединением библиотеки GPIO с Qt5 с использованием С++ 11.

Я хотел бы использовать эту библиотеку: 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;
}

person jollinski    schedule 14.08.2018    source источник


Ответы (1)


Проблема в том, что вы пытаетесь привязаться к нестатической функции-члену, но gpioTest необходимо вызывать для объекта MainWindow, следовательно, несоответствие типов. См. https://isocpp.org/wiki/faq/pointers-to-members#memfnptr-vs-fnptr, чтобы узнать подробности. Эта страница даст вам некоторые идеи, но точное решение (например, статическая функция или функция-оболочка или std::invoke и т. д.) будет зависеть от потребностей вашего приложения.

person Madden    schedule 14.08.2018
comment
Большое спасибо. Ваш комментарий и статья помогли мне решить проблему. - person jollinski; 14.08.2018