閱讀QCalendarWidget source code後,在我看來,這可能是這樣的繼承,但會有問題。
首先,從QObject派生的類,包含窗口小部件,不應該有複製構造函數。對此的解釋爲is here。 QObject析構函數是虛擬的,所以無論你如何聲明你的,it will be virtual too。
擴展類以更改其行爲時,請查找虛擬函數。如果沒有,這是一個很好的跡象表明遺傳可能不是最好的方法。在這種情況下,我們有三個虛擬方法:
virtual QSize sizeHint() const;
virtual QSize minimumSizeHint() const;
virtual void paintCell(QPainter *painter, const QRect &rect, const QDate &date) const;
前兩個是從QWidget的虛函數和處理上漿的小部件。他們可能不重要。最後一個可能做你想要的一部分:當用戶選擇一週中的某一天時,整個星期顯示爲選中狀態。
現在,對於可能出現的問題:
選擇模式屬性非虛,而且,是枚舉值。不能擴展枚舉類型以包含新建議的WeekSelection值。如果您不必在運行時更改選擇模式,則可以安全地忽略此屬性,並且只能使用星期選擇。 (忽略的屬性是一個很好的跡象,你的widget可能應該有一個QCalendarView而不是是一個QCalendarView。)
QCalendarView也是一個複合構件(不像標籤或按鈕)。在內部,它由一個QTableView,許多QToolButtons,一個QSpinBox等等組成。這種小部件很難通過繼承進行擴展,因爲您無法訪問其內部結構,並且大部分行爲(例如繪製和處理輸入事件)都是由內部小部件完成的,而不是由QCalendarView本身完成的。
在某些情況下,您可以使用findChildren()
尋找子件,並通過更改屬性和installing event filters來修改它們的行爲。然而,這很容易中斷,因爲只要保留了該類的公共二進制接口,諾基亞就可以將內部結構從4.6.2更改爲4.6.3。
問問自己,如果新小部件必須從QCalendarWidget繼承。如果不是,並繼承導致你到死衚衕,考慮複製QCalendarWidget的源代碼並適應你的需要。你可以走得更遠,並且改變原始小部件本身以包含你的行爲,並向諾基亞提出合併請求。