2010-08-04 72 views
2

目前QCalendarWidget僅支持SingleSelection或NoSelection。我希望能夠編寫一個繼承自Qt 4.6.2中的QCalendarWidget的小部件,並增加了用戶選擇一週中的任何一天並選擇該定製周的功能。如何使用C++繼承並擴展QCalendarWidget

例如點擊2010年8月5日星期四,從7月31日星期六到8月6日星期五的所有日子都將被選中。

我對Qt的使用經驗有限,而且我已經完成了一些C++,所以我需要擔心在Qt中繼承時實現複製構造函數或虛擬析構函數,還是需要注意其他陷阱?頭文件和cpp文件對於這樣的自定義小部件來說會是什麼樣子,以及哪裏是添加我的自定義繪製邏輯和SelectionMode的最佳位置?

我用gcc 4.4.3版(Ubuntu的4.4.3-4ubuntu5)和Qt 4.6.2

回答

1

閱讀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的源代碼並適應你的需要。你可以走得更遠,並且改變原始小部件本身以包含你的行爲,並向諾基亞提出合併請求。