回调函数

  • Post author:
  • Post category:其他


本次再一次见证Qt信号和槽的强大。下面是所遇所得,分享下。

回调函数,使用需要是static或者全局,即不能对其特指。

  • 使用的情景:经常遇见使用第三方的SDK,需要将我们的回调函数进行注册。
  • 遇到的问题:回调函数中使用非静态成员,即静态成员访问非静态的。
  • 涉及的细节:通常这种回调被第三方工作与其他线程。

首先,关于细节,我们可以将涉及的数据进行拷贝,通过Qt的信号和槽机制,emit出需要处理的数据,关于问题,下面的方法是推荐的。

#ifndef CALLBACKTEST_H
#define CALLBACKTEST_H

#include <QObject>

class CallBackTest : public QObject
{
    Q_OBJECT
public:
    explicit CallBackTest(QObject *parent = nullptr);

    //回调函数
    static int endFrame(QString str, void *ptr);
    static int endWork(int count, void *ptr);

signals:
    void sig_endFrame(QString str);
    void sig_endWork(int count);
    void sig_endWork(QString str);

public slots:

};

// 回调函数是针对某一个对象,故被注册的回调函数是全局,即static或者全局
// 回调函数可能位于其他线程,将要处理的数据进行memcpy,建议通过Qt的信号和槽处理数据,
// 静态函数使用非静态成员,方法1,全局对象,方法2,函数传入对象指针,使用时进行转换即可
// Qt推荐使用的死循环 QEventLoop
#include "callbacktest.h"
#include <QDebug>

typedef int (*endFrame)(QString, void*);
typedef int (*endWork)(int, void*);

void setCallBackFuns(endFrame ef, endWork eW);
void setCallBackFuns(endFrame ef, endWork eW, void* ptr){
    // do some thing
    // loop
    // time to do
    ef("ef", ptr);
    eW(1, ptr);
}

CallBackTest::CallBackTest(QObject *parent) : QObject(parent)
{

    connect(this, &CallBackTest::sig_endFrame, [](QString str){
        qDebug() << "callBack_eF" << str;
    });


    connect(this, static_cast<void(CallBackTest::*)(int)>(&CallBackTest::sig_endWork), [](int count){
        qDebug() << "callBack_eW_int" << count;
    });

    connect(this, static_cast<void(CallBackTest::*)(QString)>(&CallBackTest::sig_endWork), [](QString str){
       qDebug() << "callBack_eW_str" << str;
    });
    // 注册回调
    setCallBackFuns(endFrame, endWork, this);
}

int CallBackTest::endFrame(QString str, void *ptr)
{
    CallBackTest *pThis = static_cast<CallBackTest*>(ptr);
    if(pThis){
        pThis->sig_endFrame(str);
        return 0;
    }
    return -1;
}

int CallBackTest::endWork(int count, void *ptr)
{
    CallBackTest *pThis = static_cast<CallBackTest*>(ptr);
    if(pThis){
        pThis->sig_endWork(count);
        pThis->sig_endWork("endwork");
        return 0;
    }
    return -1;
}



版权声明:本文为qq_39175540原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。