不能繼承于QObject的類就一定不能使用信號槽?
首先不能繼承QObject的情況在開發(fā)中遇到得并不多艺糜,筆者在一年多的Qt項(xiàng)目開發(fā)中只遇到兩三次。而且都是因?yàn)橐M(jìn)了第三方庫導(dǎo)致編譯過程中報錯吴超。
要想解決這個問題其實(shí)不難奴烙,因?yàn)楣P者遇到的問題都是想定義一個信號庄呈,定義的槽情況沒有遇到過蜕煌,可以提出一個想法诬留,有需要的朋友試一下斜纪。
要想實(shí)現(xiàn)信號發(fā)送文兑,可以定義一個信號發(fā)射器類繼承于QObject,然后在想要發(fā)送信息的類里定義一個信號發(fā)射器:
只要在想觸發(fā)信號的地方調(diào)用信號發(fā)射器的sendMsg()函數(shù)就可以讓信號發(fā)射器將信號發(fā)出绿贞。
要想實(shí)現(xiàn)槽的話因块,可以同處理信號的方式解決,建立一個信號處理器籍铁,將要處理的內(nèi)容傳入其中即可。
另外還想啰嗦幾句吩愧,雖然這個方法是筆者為了解決某些類不能繼承于QObject想到的,但是不只限于解決這一種情形增显。
在一次項(xiàng)目中雁佳,遇到一個問題:很多個(自動添加的)控件,點(diǎn)擊某個控件就將其自帶的信息顯示在一個文本框中,我解決的方案就是將一個信號處理器使用單例模式編寫甘穿,在控件的基類中的clicked()響應(yīng)的槽函數(shù)中去調(diào)用sendMsg()實(shí)現(xiàn)的梢杭。
Qt浮動按鈕的實(shí)現(xiàn)
效果如下:
估計很多做Qt有一定經(jīng)驗(yàn)的朋友會覺得這個效果不難,但是這是一個需求奇葩的實(shí)際業(yè)務(wù)中做出的效果募判。筆者會想講下客戶的需求和整體框架的矛盾。
整個項(xiàng)目主要是由Qt搭建的届垫,圖上的地圖是JavaScript實(shí)現(xiàn)的全释。顯然要實(shí)現(xiàn)這個效果在地圖控件中去實(shí)現(xiàn)在結(jié)構(gòu)上會更加合理装处,但是這些按鈕的功能是需要打開對應(yīng)的QWidget浸船,如果是在地圖控件中實(shí)現(xiàn)會讓這個公司長期維護(hù)的地圖控件嵌入業(yè)務(wù)相關(guān)的代碼,這是不合理的李命。如果是在Qt這里實(shí)現(xiàn),因?yàn)榈貓D控件是嵌入在一個QWidget中黔州,所以在QWidget上做出不屬于gaiQWidget的浮動按鈕才是真正的挑戰(zhàn)阔籽。
將所有按鈕放入一個QWidget中,在QWidget中利用這兩行代碼就可以實(shí)現(xiàn)出一組浮動的按鈕笆制,但是位置還不對。
然后是在你這組浮動按鈕的父窗口中實(shí)現(xiàn)以下事件響應(yīng):
moveEvent是為了讓浮動按鈕跟隨父窗口移動君躺,hideEvent是跟隨父窗口隱藏开缎,為什么筆者還要實(shí)現(xiàn)showEvent、paintEvent這是因?yàn)樵趕how的過程中奕删,浮動按鈕會先于父窗口恢復(fù)俺泣,給人以很怪異的感覺,所以在showEvent中將m_bISToolWidgetShow賦值為真,在接下來的PaintEvent中讓浮動按鈕晚一點(diǎn)顯示横漏,再將m_bISToolWidgetShow賦值為假熟掂,如果不是因?yàn)閟how進(jìn)的paintEvent就不需要這個處理。
總結(jié):也許筆者這些利用黑科技解決的Qt問題你一輩子都遇不上赴肚,但是一旦遇上會讓你抓狂。我分享這些的經(jīng)驗(yàn)不僅僅是為了解決某些特定的問題指厌,更是為了給你提供一些解決的思路踊跟。
?