Qt中繼承控件重寫paintEvent函數後沒有顯示的問題解決

        今天一個同學遇到了一個問題,是這樣的:她寫了一個繼承QLabel的派生,重寫了裏面的paintEvent函數,創建對象並set了圖片進去,編譯沒錯,正常運行,結果就是那個label什麼都沒有顯示出來.

        我最初以爲是她的paintEvent沒寫好,於是在裏面調用了父類的paintEvent,並直接在uilabel中寫入一串字符,可運行後還是什麼都沒有顯示.於是我懷疑那個paintEvent跟本就沒有被調用過,於是調試了一下,果然.

        然而我一直想不懂爲什麼paintEvent會沒有調用.

        直到她突然發現要在派生類構造函數後面加上成員初始化列表:QLabel(parent),然後程序就好了.

        原來是省略了成員初始化列表惹的禍.

        基類對象必須首先被創建,如果不調用基類構造函數,程序將會使用默認的基類構造函數.多數情況下,編譯器爲類生成一個公有的默認構造函數,只有下面兩種情況例外:

        1.一個類顯式地聲明瞭任何構造函數,編譯器不生成公有的默認構造函數。這這種情況下,如果程序需要一個默認構造函數,需要由類的設計者提供。

        2.一個類聲明瞭一個非公有的默認構造函數,編譯器不會生成公有的默認構造函數。

        查看了qt源碼中qlabel類的定義,發現它是有顯示聲明瞭構造函數的,所以不會生成默認構造函數,因此必須得在派生QLabel類的構造函數後面加上成員初始化列表:QLabel(parent),這樣才能正確地創建基類對象,從而正確地創建派生類對象.


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章