Qt5 中带有 pigpio 库的 C++ 回调函数

标签 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();
}

主窗口.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:
    .
    .
    .    

};

主窗口.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;
}

最佳答案

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

关于Qt5 中带有 pigpio 库的 C++ 回调函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51845195/

相关文章:

java - 在 AsyncTask 中使用回调函数时出现 NullpointerException

Javascript Date.getTimezoneOffset() 在 Node-red 中不起作用

android - 使用安卓应用程序控制外设

c++ - luabind 和静态字段

c++ - 在 bindValue(...) 函数中使用 select 语句 - Qt & SQLite

c++ - ios::trunc 如何在 C++ 中为二进制文件工作?

c++ - 在 3D 渲染二进制文件中嵌入 Flash

c++ - 使用 GetProcAddress : callback function fails with invalid parameter 从 C++ 调用 Delphi DLL

jquery - 使用 jQuery 隐藏然后显示 div

java - 在 Java 中解释/开发/输入/鼠标