最近將公司的界面開發庫從WX轉換到了QT,有了信號和槽,原本我們在使用WX的時候,為了使用信號,我們是使用BOOST的signal2庫,到了QT有了信號槽,這個就沒什么必要了
但是前段時間使用QT發現QT的信號和槽沒有placeholder,也就是占位符,於是信號和槽聲明只能嚴格地一樣,比如
void slot(int val); void signal( int val);
但是在signals2,我們可用利用placeholder,及時函數聲明不一樣,也可用進行connect
void slot(int val); void signal( int val); void slot1(int val,double x,double y); void slot2(double x,int val );
這樣我們可用少寫很多代碼來對數據進行binding,組里其他人為了達到這種效果,於是要么聲明一個類,然后類里面聲明一堆可能用到的數據,再發送,有的則是發送多個信號,非常蛋疼
我本來想把qt的信號換成boost的信號,后來老大不同意,理由是增加學習成本,雖然我一直覺得沒什么成本
不過后來寫代碼的是否發現QT里面connect有多個聲明,我看了下,一個聲明是由類似於boost的利用模板的,我嘗試使用了下,發現確實可用使用匿名函數
connect( sender,&signal,[&](void) {lambdafunctionBody;} );
但是在使用bind的時候,死活都無法connect,一旦connect就會編譯錯誤
auto fnBind = boost::bind( &class::function,this ); connect( sender,&slot,fnBind );
調了一下午才發現,QT的connect是使用模板的,他不會自動把fnBind轉換為function,這樣在編譯的時候,自然因為不符合function的語法而編譯錯誤,而auto是會
把fnBind推導為boost::bind類型的,於是只能自己手動編寫了
boost::function<void(void)> fnBind = boost::bind( &class::function,this ); connect( sender,&slot,fnBind );
編譯通過,不用寫那么蛋疼的代碼了