本次再一次见证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 版权协议,转载请附上原文出处链接和本声明。