在暑假的時候就一直有這種感覺了,最近在逃避現實(?)的時候又有這種強烈感覺....
覺得它很神奇也可能是我程式寫太少了吧。
覺得它很神奇也可能是我程式寫太少了吧。
首先是它編譯的方式,必須要先用qmake產生.pro檔[?],然後再根據.pro檔生成Makefile,也可以用來生成VC用的專案檔。當然這也不算啥新鮮事,古早的autoconf和automake就是在做這檔事。
然後呢被C或C++摧殘過的人都知道一件事:Pointers are EVIL.
但是Qt卻反其道而行,在傳參數的時候卻大量使用指標,建構物件也幾乎都是使用指標和new,但是你卻很少看到需要自己delete的情形。這是因為Qt仰賴一種委派機制,把自己的生命週期交給上層物件管理,當上層物件被釋放時,自己才被釋放。
Well,其實這對GUI的設計來說還滿合理的,但是當你new一堆物件卻沒delete時,心裡總是會毛毛的XD[!]
但是Qt卻反其道而行,在傳參數的時候卻大量使用指標,建構物件也幾乎都是使用指標和new,但是你卻很少看到需要自己delete的情形。這是因為Qt仰賴一種委派機制,把自己的生命週期交給上層物件管理,當上層物件被釋放時,自己才被釋放。
Well,其實這對GUI的設計來說還滿合理的,但是當你new一堆物件卻沒delete時,心裡總是會毛毛的XD[!]
被學院派教過C++的人應該也聽過,macros也是一個應該在C++裡極力避免使用的東西,但是Qt也是有很多很神奇的macros,像是Q_OBJECT, SIGNAL, SLOT等等...SIGNAL和SLOT甚至可以把函式轉成字串,再透過meta programming達成事件連結的功能....
缺點就是通常要到執行期才會發現signal或slot的錯誤。[?]
缺點就是通常要到執行期才會發現signal或slot的錯誤。[?]
Meta Programming也是一個特色....前述的Q_OBJECT的功用就是用在這裡,總之它會根據macro另外產生出cpp檔,以達成signal/slot機制。
比較討厭的是它會強制要把介面和實作分離,而且不能用在template class上。
比較討厭的是它會強制要把介面和實作分離,而且不能用在template class上。
而它在事件的驅動部分,使用的就是signal/slot方式。簡單的說,每個類別都可以有若干signal和slot,signal用來發送事件,slot則是接收事件後的動作。你可以將任意兩個物件的signal和slot連結起來,而且不限定為一對一的連結。
這和callback有點不同,callback會讓物件有若干監聽函式,比方說onClick之類的,然後把你要觸發的動作包成一個函式傳進去。callback的做法比較簡單明瞭,但是有其限制。比方說現在你想要對一個按鈕元件監聽它的文字是否改變,這時候除非該物件有提供這個監聽函式,或是一定有某個事件會和它同時發生,否則很難監聽這個事件。
signal/slot機制則沒有這個困擾,因為類別的signal和slot函式都是可以自己擴充的,甚至可以在slot函式裡再發射signal出去。對於C++來說,唯一的缺憾就是,對類別擴充函式的唯一方法,就是繼承,這在很多時候不是那麼的方便。
這和callback有點不同,callback會讓物件有若干監聽函式,比方說onClick之類的,然後把你要觸發的動作包成一個函式傳進去。callback的做法比較簡單明瞭,但是有其限制。比方說現在你想要對一個按鈕元件監聽它的文字是否改變,這時候除非該物件有提供這個監聽函式,或是一定有某個事件會和它同時發生,否則很難監聽這個事件。
signal/slot機制則沒有這個困擾,因為類別的signal和slot函式都是可以自己擴充的,甚至可以在slot函式裡再發射signal出去。對於C++來說,唯一的缺憾就是,對類別擴充函式的唯一方法,就是繼承,這在很多時候不是那麼的方便。
附帶一提,Kate果然是KDE的爪牙XD[?]
沒有留言:
張貼留言