C++ 将自定义库回调转换为Qt信号
我有一个库(我正在开发,所以我可以稍微更改接口),它大量使用C回调。我需要将这些信号从回调转换为Qt信号。到目前为止,我最好的解决方案是代理QObject,它将对它的简单方法的调用转发给Qt信号C++ 将自定义库回调转换为Qt信号,c++,qt,callback,signals-slots,C++,Qt,Callback,Signals Slots,我有一个库(我正在开发,所以我可以稍微更改接口),它大量使用C回调。我需要将这些信号从回调转换为Qt信号。到目前为止,我最好的解决方案是代理QObject,它将对它的简单方法的调用转发给Qt信号 class QSignalProxy: public QObject { public: // callback handlers // ================================================== friend void __stdcall c
class QSignalProxy: public QObject
{
public:
// callback handlers
// ==================================================
friend void __stdcall callbackType1(void * callbackData, int x)
{
if (!callbackData)
return;
QSignalProxy * proxy = reinterpret_cast<QSignalProxy*>(callbackData);
proxy->onCallbackType1(x);
}
friend void __stdcall callbackType2(void * callbackData, float x)
{
if (!callbackData)
return;
QSignalProxy * proxy = reinterpret_cast<QSignalProxy*>(callbackData);
proxy->onCallbackType2(x);
}
friend void __stdcall callbackType3(void * callbackData, const char * x)
{
if (!callbackData)
return;
QSignalProxy * proxy = reinterpret_cast<QSignalProxy*>(callbackData);
proxy->onCallbackType3(x);
}
friend void __stdcall callbackType4(void * callbackData, LibObjectHandle * x)
{
if (!callbackData)
return;
QSignalProxy * proxy = reinterpret_cast<QSignalProxy*>(callbackData);
proxy->onCallbackType4(x);
}
QSignalProxy(QObject * parent = 0)
: QObject(parent)
{}
private:
// each call do nothing, but emit corresponding signal
void onCallbackType1(int x) { emit signalType1(x); }
void onCallbackType2(float x) { emit signalType2(x); }
void onCallbackType3(const char * x) { emit signalType3(QString::fromUTF8(x)); }
void onCallbackType4(const LibObjectHandle * x)
{
emit signalType4(LibObjectParams(x)); // LibObjectParams - some helper class, that allows to acces LibObject params
// in a conviniet way
}
public signals:
// Desired Qt signals, availible for connection
void signalType1(int x);
void signalType2(float x);
void signalType3(const QString & x);
void signalType4(const LibOjectParams & x);
}
int main()
{
MyLibCore * core = MyLibCreateCore();
QSignalProxy signalProxy;
MyLibSetCallbacks(core, &signalProxy /*as callback data*/,
callbackType1, callbackType2, callbackType3, callbackType4);
// start library, wich creates working threads, that will *emit signals* to callbacks
MyLibStart(core);
int retcode = MyLibWaitFinish(core);
return retcode;
}
类QSignalProxy:公共QObject
{
公众:
//回调处理程序
// ==================================================
friend void\uu stdcall callbackType1(void*callbackData,int x)
{
如果(!callbackData)
返回;
QSignalProxy*proxy=重新解释(回调数据);
代理->onCallbackType1(x);
}
friend void\uu stdcall callbackType2(void*callbackData,float x)
{
如果(!callbackData)
返回;
QSignalProxy*proxy=重新解释(回调数据);
代理->onCallbackType2(x);
}
friend void\uu stdcall callbackType3(void*callbackData,const char*x)
{
如果(!callbackData)
返回;
QSignalProxy*proxy=重新解释(回调数据);
代理->onCallbackType3(x);
}
friend void\uu stdcall callbackType4(void*callbackData,LibObjectHandle*x)
{
如果(!callbackData)
返回;
QSignalProxy*proxy=重新解释(回调数据);
代理->onCallbackType4(x);
}
QSignalProxy(QObject*parent=0)
:QObject(父对象)
{}
私人:
//每个调用不做任何操作,但会发出相应的信号
void onCallbackType1(int x){emit signalType1(x);}
void onCallbackType2(float x){emit signalType2(x);}
void onCallbackType3(const char*x){emit signalType3(QString::fromUTF8(x));}
void onCallbackType4(常量LibObjectHandle*x)
{
emit signalType4(LibObjectParams(x));//LibObjectParams-允许访问LibObject参数的某个帮助器类
//以方便的方式
}
公共信号:
//所需的Qt信号,可用于连接
无效信号类型1(int x);
无效信号类型2(浮动x);
无效信号类型3(常数Q字符串和x);
无效信号类型4(常量LibOjectParams&x);
}
int main()
{
MyLibCore*core=MyLibCreateCore();
QSignalProxy信号代理;
MyLibSetCallbacks(核心,&signalProxy/*作为回调数据*/,,
callbackType1、callbackType2、callbackType3、callbackType4);
//启动库,它创建工作线程,将*向回调*发出信号*
MyLibStart(核心);
int-retcode=MyLibWaitFinish(核心);
返回代码;
}
正如您所看到的,它的可伸缩性非常差。库内部也有类似的东西,但使用的是观察者模式。所以,要添加或修改回调,我需要大致在四到五个位置更改代码。这是可悲的
我是否可以放弃这个代理QObject并发射Qt信号,而不通过它进行愚蠢的转发?它可以使这种方法更具可扩展性