QT5中的信號與槽與C++ 11的function的配合


最近將公司的界面開發庫從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 );

編譯通過,不用寫那么蛋疼的代碼了

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM