今天一個同學遇到了一個問題,是這樣的:她寫了一個繼承QLabel的派生類,重寫了裏面的paintEvent函數,創建對象並set了圖片進去,編譯沒錯,正常運行,結果就是那個label什麼都沒有顯示出來.
我最初以爲是她的paintEvent沒寫好,於是在裏面調用了父類的paintEvent,並直接在ui的label中寫入一串字符,可運行後還是什麼都沒有顯示.於是我懷疑那個paintEvent跟本就沒有被調用過,於是調試了一下,果然.
然而我一直想不懂爲什麼paintEvent會沒有調用.
直到她突然發現要在派生類構造函數後面加上成員初始化列表:QLabel(parent),然後程序就好了.
原來是省略了成員初始化列表惹的禍.
基類對象必須首先被創建,如果不調用基類構造函數,程序將會使用默認的基類構造函數.多數情況下,編譯器爲類生成一個公有的默認構造函數,只有下面兩種情況例外:
1.一個類顯式地聲明瞭任何構造函數,編譯器不生成公有的默認構造函數。這這種情況下,如果程序需要一個默認構造函數,需要由類的設計者提供。
2.一個類聲明瞭一個非公有的默認構造函數,編譯器不會生成公有的默認構造函數。
查看了qt源碼中qlabel類的定義,發現它是有顯示聲明瞭構造函數的,所以不會生成默認構造函數,因此必須得在派生QLabel類的構造函數後面加上成員初始化列表:QLabel(parent),這樣才能正確地創建基類對象,從而正確地創建派生類對象.