1 /****************************************************************************
3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
4 ** All rights reserved.
5 ** Contact: Nokia Corporation (qt-info@nokia.com)
7 ** This file is part of the documentation of the Qt Toolkit.
9 ** $QT_BEGIN_LICENSE:LGPL$
10 ** No Commercial Usage
11 ** This file contains pre-release code and may not be distributed.
12 ** You may use this file in accordance with the terms and conditions
13 ** contained in the Technology Preview License Agreement accompanying
16 ** GNU Lesser General Public License Usage
17 ** Alternatively, this file may be used under the terms of the GNU Lesser
18 ** General Public License version 2.1 as published by the Free Software
19 ** Foundation and appearing in the file LICENSE.LGPL included in the
20 ** packaging of this file. Please review the following information to
21 ** ensure the GNU Lesser General Public License version 2.1 requirements
22 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
24 ** In addition, as a special exception, Nokia gives you certain additional
25 ** rights. These rights are described in the Nokia Qt LGPL Exception
26 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
28 ** If you have questions regarding the use of this file, please contact
29 ** Nokia at qt-info@nokia.com.
40 ****************************************************************************/
43 \title Calendar Widget Example
44 \example widgets/calendarwidget
46 The Calendar Widget example shows use of \c QCalendarWidget.
48 \image calendarwidgetexample.png
50 QCalendarWidget displays one calendar month
51 at a time and lets the user select a date.
52 The calendar consists of four components: a navigation
53 bar that lets the user change the month that is
54 displayed, a grid where each cell represents one day
55 in the month, and two headers that display weekday names
58 The Calendar Widget example displays a QCalendarWidget and lets the user
59 configure its appearance and behavior using
60 \l{QComboBox}es, \l{QCheckBox}es, and \l{QDateEdit}s. In
61 addition, the user can influence the formatting of individual dates
64 The properties of the QCalendarWidget are summarized in the table
70 \row \o \l{QCalendarWidget::}{selectedDate}
71 \o The currently selected date.
72 \row \o \l{QCalendarWidget::}{minimumDate}
73 \o The earliest date that can be selected.
74 \row \o \l{QCalendarWidget::}{maximumDate}
75 \o The latest date that can be selected.
76 \row \o \l{QCalendarWidget::}{firstDayOfWeek}
77 \o The day that is displayed as the first day of the week
78 (usually Sunday or Monday).
79 \row \o \l{QCalendarWidget::}{gridVisible}
80 \o Whether the grid should be shown.
81 \row \o \l{QCalendarWidget::}{selectionMode}
82 \o Whether the user can select a date or not.
83 \row \o \l{QCalendarWidget::}{horizontalHeaderFormat}
84 \o The format of the day names in the horizontal header
85 (e.g., "M", "Mon", or "Monday").
86 \row \o \l{QCalendarWidget::}{verticalHeaderFormat}
87 \o The format of the vertical header.
88 \row \o \l{QCalendarWidget::}{navigationBarVisible}
89 \o Whether the navigation bar at the top of the calendar
93 The example consists of one class, \c Window, which creates and
94 lays out the QCalendarWidget and the other widgets that let the
95 user configure the QCalendarWidget.
97 \section1 Window Class Definition
99 Here is the definition of the \c Window class:
101 \snippet examples/widgets/calendarwidget/window.h 0
103 \snippet examples/widgets/calendarwidget/window.h 1
105 As is often the case with classes that represent self-contained
106 windows, most of the API is private. We will review the private
107 members as we stumble upon them in the implementation.
109 \section1 Window Class Implementation
111 Let's now review the class implementation, starting with the constructor:
113 \snippet examples/widgets/calendarwidget/window.cpp 0
115 We start by creating the four \l{QGroupBox}es and their child
116 widgets (including the QCalendarWidget) using four private \c
117 create...GroupBox() functions, described below. Then we arrange
118 the group boxes in a QGridLayout.
120 We set the grid layout's resize policy to QLayout::SetFixedSize to
121 prevent the user from resizing the window. In that mode, the
122 window's size is set automatically by QGridLayout based on the
123 size hints of its contents widgets.
125 To ensure that the window isn't automatically resized every time
126 we change a property of the QCalendarWidget (e.g., hiding the
127 navigation bar, trhe vertical header, or the grid), we set the
128 minimum height of row 0 and the minimum width of column 0 to the
129 initial size of the QCalendarWidget.
131 Let's move on to the \c createPreviewGroupBox() function:
133 \snippet examples/widgets/calendarwidget/window.cpp 9
135 The \gui Preview group box contains only one widget: the
136 QCalendarWidget. We set it up, connect its
137 \l{QCalendarWidget::}{currentPageChanged()} signal to our \c
138 reformatCalendarPage() slot to make sure that every new page gets
139 the formatting specified by the user.
141 The \c createGeneralOptionsGroupBox() function is somewhat large
142 and several widgets are set up the same way; we look at parts of
143 its implementation here and skip the rest:
145 \snippet examples/widgets/calendarwidget/window.cpp 10
148 We start with the setup of the \gui{Week starts on} combobox.
149 This combobox controls which day should be displayed as the first
152 The QComboBox class lets us attach user data as a QVariant to
153 each item. The data can later be retrieved with QComboBox's
154 \l{QComboBox::}{itemData()} function. QVariant doesn't directly
155 support the Qt::DayOfWeek data type, but it supports \c int, and
156 C++ will happily convert any enum value to \c int.
159 \snippet examples/widgets/calendarwidget/window.cpp 11
162 After creating the widgets, we connect the signals and slots. We
163 connect the comboboxes to private slots of \c Window or to
164 public slots provided by QComboBox.
167 \snippet examples/widgets/calendarwidget/window.cpp 12
169 At the end of the function, we call the slots that update the calendar to ensure
170 that the QCalendarWidget is synchronized with the other widgets on startup.
172 Let's now take a look at the \c createDatesGroupBox() private function:
174 \snippet examples/widgets/calendarwidget/window.cpp 13
176 In this function, we create the \gui {Minimum Date}, \gui {Maximum Date},
177 and \gui {Current Date} editor widgets,
178 which control the calendar's minimum, maximum, and selected dates.
179 The calendar's minimum and maximum dates have already been
180 set in \c createPrivewGroupBox(); we can then set the widgets
181 default values to the calendars values.
183 \snippet examples/widgets/calendarwidget/window.cpp 14
185 \snippet examples/widgets/calendarwidget/window.cpp 15
187 We connect the \c currentDateEdit's
188 \l{QDateEdit::}{dateChanged()} signal directly to the calendar's
189 \l{QCalendarWidget::}{setSelectedDate()} slot. When the calendar's
190 selected date changes, either as a result of a user action or
191 programmatically, our \c selectedDateChanged() slot updates
192 the \gui {Current Date} editor. We also need to react when the user
193 changes the \gui{Minimum Date} and \gui{Maximum Date} editors.
195 Here is the \c createTextFormatsGroup() function:
197 \snippet examples/widgets/calendarwidget/window.cpp 16
199 We set up the \gui {Weekday Color} and \gui {Weekend Color} comboboxes
200 using \c createColorCombo(), which instantiates a QComboBox and
201 populates it with colors ("Red", "Blue", etc.).
203 \snippet examples/widgets/calendarwidget/window.cpp 17
205 The \gui {Header Text Format} combobox lets the user change the
206 text format (bold, italic, or plain) used for horizontal and
207 vertical headers. The \gui {First Friday in blue} and \gui {May 1
208 in red} check box affect the rendering of specific dates.
210 \snippet examples/widgets/calendarwidget/window.cpp 18
212 We connect the check boxes and comboboxes to various private
213 slots. The \gui {First Friday in blue} and \gui {May 1 in red}
214 check boxes are both connected to \c reformatCalendarPage(),
215 which is also called when the calendar switches month.
218 \snippet examples/widgets/calendarwidget/window.cpp 19
220 At the end of \c createTextFormatsGroupBox(), we call private
221 slots to synchronize the QCalendarWidget with the other widgets.
223 We're now done reviewing the four \c create...GroupBox()
224 functions. Let's now take a look at the other private functions
227 \snippet examples/widgets/calendarwidget/window.cpp 20
229 In \c createColorCombo(), we create a combobox and populate it with
230 standard colors. The second argument to QComboBox::addItem()
231 is a QVariant storing user data (in this case, QColor objects).
233 This function was used to set up the \gui {Weekday Color}
234 and \gui {Weekend Color} comboboxes.
236 \snippet examples/widgets/calendarwidget/window.cpp 1
238 When the user changes the \gui {Week starts on} combobox's
239 value, \c firstDayChanged() is invoked with the index of the
240 combobox's new value. We retrieve the custom data item
241 associated with the new current item using
242 \l{QComboBox::}{itemData()} and cast it to a Qt::DayOfWeek.
244 \c selectionModeChanged(), \c horizontalHeaderChanged(), and \c
245 verticalHeaderChanged() are very similar to \c firstDayChanged(),
248 \snippet examples/widgets/calendarwidget/window.cpp 2
250 The \c selectedDateChanged() updates the \gui{Current Date}
251 editor to reflect the current state of the QCalendarWidget.
253 \snippet examples/widgets/calendarwidget/window.cpp 3
255 When the user changes the minimum date, we tell the
256 QCalenderWidget. We also update the \gui {Maximum Date} editor,
257 because if the new minimum date is later than the current maximum
258 date, QCalendarWidget will automatically adapt its maximum date
259 to avoid a contradicting state.
261 \snippet examples/widgets/calendarwidget/window.cpp 4
263 \c maximumDateChanged() is implemented similarly to \c
264 minimumDateChanged().
266 \snippet examples/widgets/calendarwidget/window.cpp 5
268 Each combobox item has a QColor object as user data corresponding to the
269 item's text. After fetching the colors from the comboboxes, we
270 set the text format of each day of the week.
272 The text format of a column in the calendar is given as a
273 QTextCharFormat, which besides the foreground color lets us
274 specify various character formatting information. In this
275 example, we only show a subset of the possibilities.
277 \snippet examples/widgets/calendarwidget/window.cpp 6
279 \c weekendFormatChanged() is the same as \c
280 weekdayFormatChanged(), except that it affects Saturday and
281 Sunday instead of Monday to Friday.
283 \snippet examples/widgets/calendarwidget/window.cpp 7
285 The \c reformatHeaders() slot is called when the user
286 changes the text format of
287 the headers. We compare the current text of the \gui {Header Text Format}
288 combobox to determine which format to apply. (An alternative would
289 have been to store \l{QTextCharFormat} values alongside the combobox
292 \snippet examples/widgets/calendarwidget/window.cpp 8
294 In \c reformatCalendarPage(), we set the text format of the first
295 Friday in the month and May 1 in the current year. The text
296 formats that are actually used depend on which check boxes are
299 QCalendarWidget lets us set the text format of individual dates
300 with the \l{QCalendarWidget::}{setDateTextFormat()}. We chose to
301 set the dates when the calendar page changes, i.e., a new month is
302 displayed. We check which of the \c mayFirstCheckBox and \c
303 firstDayCheckBox, if any, are checked
304 and set the text formats accordingly.