Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将自定义库回调转换为Qt信号_C++_Qt_Callback_Signals Slots - Fatal编程技术网

C++ 将自定义库回调转换为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

我有一个库(我正在开发,所以我可以稍微更改接口),它大量使用C回调。我需要将这些信号从回调转换为Qt信号。到目前为止,我最好的解决方案是代理QObject,它将对它的简单方法的调用转发给Qt信号

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信号,而不通过它进行愚蠢的转发?它可以使这种方法更具可扩展性