Mega Code Archive

 
Categories / C++ / Qt
 

Calendar widget

/**************************************************************************** ** ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial Usage ** Licensees holding valid Qt Commercial licenses may use this file in ** accordance with the Qt Commercial License Agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Nokia. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file.  Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Nokia gives you certain additional ** rights.  These rights are described in the Nokia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file.  Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** If you have questions regarding the use of this file, please contact ** Nokia at qt-info@nokia.com. ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef WINDOW_H #define WINDOW_H #include <QWidget> QT_BEGIN_NAMESPACE class QCalendarWidget; class QCheckBox; class QComboBox; class QDate; class QDateEdit; class QGridLayout; class QGroupBox; class QLabel; QT_END_NAMESPACE class Window : public QWidget {     Q_OBJECT public:     Window(); private slots:     void localeChanged(int index);     void firstDayChanged(int index);     void selectionModeChanged(int index);     void horizontalHeaderChanged(int index);     void verticalHeaderChanged(int index);     void selectedDateChanged();     void minimumDateChanged(const QDate &date);     void maximumDateChanged(const QDate &date);     void weekdayFormatChanged();     void weekendFormatChanged();     void reformatHeaders();     void reformatCalendarPage(); private:     void createPreviewGroupBox();     void createGeneralOptionsGroupBox();     void createDatesGroupBox();     void createTextFormatsGroupBox();     QComboBox *createColorComboBox();     QGroupBox *previewGroupBox;     QGridLayout *previewLayout;     QCalendarWidget *calendar;     QGroupBox *generalOptionsGroupBox;     QLabel *localeLabel;     QLabel *firstDayLabel;     QLabel *selectionModeLabel;     QLabel *horizontalHeaderLabel;     QLabel *verticalHeaderLabel;     QComboBox *localeCombo;     QComboBox *firstDayCombo;     QComboBox *selectionModeCombo;     QCheckBox *gridCheckBox;     QCheckBox *navigationCheckBox;     QComboBox *horizontalHeaderCombo;     QComboBox *verticalHeaderCombo;     QGroupBox *datesGroupBox;     QLabel *currentDateLabel;     QLabel *minimumDateLabel;     QLabel *maximumDateLabel;     QDateEdit *currentDateEdit;     QDateEdit *minimumDateEdit;     QDateEdit *maximumDateEdit;     QGroupBox *textFormatsGroupBox;     QLabel *weekdayColorLabel;     QLabel *weekendColorLabel;     QLabel *headerTextFormatLabel;     QComboBox *weekdayColorCombo;     QComboBox *weekendColorCombo;     QComboBox *headerTextFormatCombo;     QCheckBox *firstFridayCheckBox;     QCheckBox *mayFirstCheckBox; }; #endif #include <QtGui> #include "window.h" Window::Window() {     createPreviewGroupBox();     createGeneralOptionsGroupBox();     createDatesGroupBox();     createTextFormatsGroupBox();     QGridLayout *layout = new QGridLayout;     layout->addWidget(previewGroupBox, 0, 0);     layout->addWidget(generalOptionsGroupBox, 0, 1);     layout->addWidget(datesGroupBox, 1, 0);     layout->addWidget(textFormatsGroupBox, 1, 1);     layout->setSizeConstraint(QLayout::SetFixedSize);     setLayout(layout);     previewLayout->setRowMinimumHeight(0, calendar->sizeHint().height());     previewLayout->setColumnMinimumWidth(0, calendar->sizeHint().width());     setWindowTitle(tr("Calendar Widget")); } void Window::localeChanged(int index) {     calendar->setLocale(localeCombo->itemData(index).toLocale()); } void Window::firstDayChanged(int index) {     calendar->setFirstDayOfWeek(Qt::DayOfWeek(                                 firstDayCombo->itemData(index).toInt())); } void Window::selectionModeChanged(int index) {     calendar->setSelectionMode(QCalendarWidget::SelectionMode(                                selectionModeCombo->itemData(index).toInt())); } void Window::horizontalHeaderChanged(int index) {     calendar->setHorizontalHeaderFormat(QCalendarWidget::HorizontalHeaderFormat(         horizontalHeaderCombo->itemData(index).toInt())); } void Window::verticalHeaderChanged(int index) {     calendar->setVerticalHeaderFormat(QCalendarWidget::VerticalHeaderFormat(         verticalHeaderCombo->itemData(index).toInt())); } void Window::selectedDateChanged() {     currentDateEdit->setDate(calendar->selectedDate()); } void Window::minimumDateChanged(const QDate &date) {     calendar->setMinimumDate(date);     maximumDateEdit->setDate(calendar->maximumDate()); } void Window::maximumDateChanged(const QDate &date) {     calendar->setMaximumDate(date);     minimumDateEdit->setDate(calendar->minimumDate()); } void Window::weekdayFormatChanged() {     QTextCharFormat format;     format.setForeground(qvariant_cast<QColor>(         weekdayColorCombo->itemData(weekdayColorCombo->currentIndex())));     calendar->setWeekdayTextFormat(Qt::Monday, format);     calendar->setWeekdayTextFormat(Qt::Tuesday, format);     calendar->setWeekdayTextFormat(Qt::Wednesday, format);     calendar->setWeekdayTextFormat(Qt::Thursday, format);     calendar->setWeekdayTextFormat(Qt::Friday, format); } void Window::weekendFormatChanged() {     QTextCharFormat format;     format.setForeground(qvariant_cast<QColor>(         weekendColorCombo->itemData(weekendColorCombo->currentIndex())));     calendar->setWeekdayTextFormat(Qt::Saturday, format);     calendar->setWeekdayTextFormat(Qt::Sunday, format); } void Window::reformatHeaders() {     QString text = headerTextFormatCombo->currentText();     QTextCharFormat format;     if (text == tr("Bold")) {         format.setFontWeight(QFont::Bold);     } else if (text == tr("Italic")) {         format.setFontItalic(true);     } else if (text == tr("Green")) {         format.setForeground(Qt::green);     }     calendar->setHeaderTextFormat(format); } void Window::reformatCalendarPage() {     QTextCharFormat mayFirstFormat;     if (mayFirstCheckBox->isChecked())         mayFirstFormat.setForeground(Qt::red);     QTextCharFormat firstFridayFormat;     if (firstFridayCheckBox->isChecked())         firstFridayFormat.setForeground(Qt::blue);     QDate date(calendar->yearShown(), calendar->monthShown(), 1);      calendar->setDateTextFormat(QDate(date.year(), 5, 1), mayFirstFormat);     date.setDate(date.year(), date.month(), 1);     while (date.dayOfWeek() != Qt::Friday)         date = date.addDays(1);     calendar->setDateTextFormat(date, firstFridayFormat); } void Window::createPreviewGroupBox() {     previewGroupBox = new QGroupBox(tr("Preview"));     calendar = new QCalendarWidget;     calendar->setMinimumDate(QDate(1900, 1, 1));     calendar->setMaximumDate(QDate(3000, 1, 1));     calendar->setGridVisible(true);     connect(calendar, SIGNAL(currentPageChanged(int, int)),             this, SLOT(reformatCalendarPage()));     previewLayout = new QGridLayout;     previewLayout->addWidget(calendar, 0, 0, Qt::AlignCenter);     previewGroupBox->setLayout(previewLayout); } void Window::createGeneralOptionsGroupBox() {     generalOptionsGroupBox = new QGroupBox(tr("General Options"));     localeCombo = new QComboBox;     int curLocaleIndex = -1;     int index = 0;     for (int _lang = QLocale::C; _lang <= QLocale::LastLanguage; ++_lang) {         QLocale::Language lang = static_cast<QLocale::Language>(_lang);         QList<QLocale::Country> countries = QLocale::countriesForLanguage(lang);         for (int i = 0; i < countries.count(); ++i) {             QLocale::Country country = countries.at(i);             QString label = QLocale::languageToString(lang);             label += QLatin1Char('/');             label += QLocale::countryToString(country);             QLocale locale(lang, country);             if (this->locale().language() == lang && this->locale().country() == country)                 curLocaleIndex = index;             localeCombo->addItem(label, locale);             ++index;         }     }     if (curLocaleIndex != -1)         localeCombo->setCurrentIndex(curLocaleIndex);     localeLabel = new QLabel(tr("&Locale"));     localeLabel->setBuddy(localeCombo);     firstDayCombo = new QComboBox;     firstDayCombo->addItem(tr("Sunday"), Qt::Sunday);     firstDayCombo->addItem(tr("Monday"), Qt::Monday);     firstDayCombo->addItem(tr("Tuesday"), Qt::Tuesday);     firstDayCombo->addItem(tr("Wednesday"), Qt::Wednesday);     firstDayCombo->addItem(tr("Thursday"), Qt::Thursday);     firstDayCombo->addItem(tr("Friday"), Qt::Friday);     firstDayCombo->addItem(tr("Saturday"), Qt::Saturday);     firstDayLabel = new QLabel(tr("Wee&k starts on:"));     firstDayLabel->setBuddy(firstDayCombo);     selectionModeCombo = new QComboBox;     selectionModeCombo->addItem(tr("Single selection"),                                 QCalendarWidget::SingleSelection);     selectionModeCombo->addItem(tr("None"), QCalendarWidget::NoSelection);     selectionModeLabel = new QLabel(tr("&Selection mode:"));     selectionModeLabel->setBuddy(selectionModeCombo);     gridCheckBox = new QCheckBox(tr("&Grid"));     gridCheckBox->setChecked(calendar->isGridVisible());     navigationCheckBox = new QCheckBox(tr("&Navigation bar"));     navigationCheckBox->setChecked(true);     horizontalHeaderCombo = new QComboBox;     horizontalHeaderCombo->addItem(tr("Single letter day names"),                                    QCalendarWidget::SingleLetterDayNames);     horizontalHeaderCombo->addItem(tr("Short day names"),                                    QCalendarWidget::ShortDayNames);     horizontalHeaderCombo->addItem(tr("None"),                                    QCalendarWidget::NoHorizontalHeader);     horizontalHeaderCombo->setCurrentIndex(1);     horizontalHeaderLabel = new QLabel(tr("&Horizontal header:"));     horizontalHeaderLabel->setBuddy(horizontalHeaderCombo);     verticalHeaderCombo = new QComboBox;     verticalHeaderCombo->addItem(tr("ISO week numbers"),                                  QCalendarWidget::ISOWeekNumbers);     verticalHeaderCombo->addItem(tr("None"), QCalendarWidget::NoVerticalHeader);     verticalHeaderLabel = new QLabel(tr("&Vertical header:"));     verticalHeaderLabel->setBuddy(verticalHeaderCombo);     connect(localeCombo, SIGNAL(currentIndexChanged(int)),             this, SLOT(localeChanged(int)));     connect(firstDayCombo, SIGNAL(currentIndexChanged(int)),             this, SLOT(firstDayChanged(int)));     connect(selectionModeCombo, SIGNAL(currentIndexChanged(int)),             this, SLOT(selectionModeChanged(int)));     connect(gridCheckBox, SIGNAL(toggled(bool)),             calendar, SLOT(setGridVisible(bool)));     connect(navigationCheckBox, SIGNAL(toggled(bool)),             calendar, SLOT(setNavigationBarVisible(bool)));     connect(horizontalHeaderCombo, SIGNAL(currentIndexChanged(int)),             this, SLOT(horizontalHeaderChanged(int)));     connect(verticalHeaderCombo, SIGNAL(currentIndexChanged(int)),             this, SLOT(verticalHeaderChanged(int)));     QHBoxLayout *checkBoxLayout = new QHBoxLayout;     checkBoxLayout->addWidget(gridCheckBox);     checkBoxLayout->addStretch();     checkBoxLayout->addWidget(navigationCheckBox);     QGridLayout *outerLayout = new QGridLayout;     outerLayout->addWidget(localeLabel, 0, 0);     outerLayout->addWidget(localeCombo, 0, 1);     outerLayout->addWidget(firstDayLabel, 1, 0);     outerLayout->addWidget(firstDayCombo, 1, 1);     outerLayout->addWidget(selectionModeLabel, 2, 0);     outerLayout->addWidget(selectionModeCombo, 2, 1);     outerLayout->addLayout(checkBoxLayout, 3, 0, 1, 2);     outerLayout->addWidget(horizontalHeaderLabel, 4, 0);     outerLayout->addWidget(horizontalHeaderCombo, 4, 1);     outerLayout->addWidget(verticalHeaderLabel, 5, 0);     outerLayout->addWidget(verticalHeaderCombo, 5, 1);     generalOptionsGroupBox->setLayout(outerLayout);     firstDayChanged(firstDayCombo->currentIndex());     selectionModeChanged(selectionModeCombo->currentIndex());     horizontalHeaderChanged(horizontalHeaderCombo->currentIndex());     verticalHeaderChanged(verticalHeaderCombo->currentIndex()); } void Window::createDatesGroupBox() {     datesGroupBox = new QGroupBox(tr("Dates"));     minimumDateEdit = new QDateEdit;     minimumDateEdit->setDisplayFormat("MMM d yyyy");     minimumDateEdit->setDateRange(calendar->minimumDate(),                                   calendar->maximumDate());     minimumDateEdit->setDate(calendar->minimumDate());     minimumDateLabel = new QLabel(tr("&Minimum Date:"));     minimumDateLabel->setBuddy(minimumDateEdit);     currentDateEdit = new QDateEdit;     currentDateEdit->setDisplayFormat("MMM d yyyy");     currentDateEdit->setDate(calendar->selectedDate());     currentDateEdit->setDateRange(calendar->minimumDate(),                                   calendar->maximumDate());     currentDateLabel = new QLabel(tr("&Current Date:"));     currentDateLabel->setBuddy(currentDateEdit);     maximumDateEdit = new QDateEdit;     maximumDateEdit->setDisplayFormat("MMM d yyyy");     maximumDateEdit->setDateRange(calendar->minimumDate(),                                   calendar->maximumDate());     maximumDateEdit->setDate(calendar->maximumDate());     maximumDateLabel = new QLabel(tr("Ma&ximum Date:"));     maximumDateLabel->setBuddy(maximumDateEdit);       connect(currentDateEdit, SIGNAL(dateChanged(const QDate &)),             calendar, SLOT(setSelectedDate(const QDate &)));     connect(calendar, SIGNAL(selectionChanged()),             this, SLOT(selectedDateChanged()));     connect(minimumDateEdit, SIGNAL(dateChanged(const QDate &)),             this, SLOT(minimumDateChanged(const QDate &)));     connect(maximumDateEdit, SIGNAL(dateChanged(const QDate &)),             this, SLOT(maximumDateChanged(const QDate &)));     QGridLayout *dateBoxLayout = new QGridLayout;     dateBoxLayout->addWidget(currentDateLabel, 1, 0);     dateBoxLayout->addWidget(currentDateEdit, 1, 1);     dateBoxLayout->addWidget(minimumDateLabel, 0, 0);     dateBoxLayout->addWidget(minimumDateEdit, 0, 1);     dateBoxLayout->addWidget(maximumDateLabel, 2, 0);     dateBoxLayout->addWidget(maximumDateEdit, 2, 1);     dateBoxLayout->setRowStretch(3, 1);     datesGroupBox->setLayout(dateBoxLayout); } void Window::createTextFormatsGroupBox() {     textFormatsGroupBox = new QGroupBox(tr("Text Formats"));     weekdayColorCombo = createColorComboBox();     weekdayColorCombo->setCurrentIndex(             weekdayColorCombo->findText(tr("Black")));     weekdayColorLabel = new QLabel(tr("&Weekday color:"));     weekdayColorLabel->setBuddy(weekdayColorCombo);     weekendColorCombo = createColorComboBox();     weekendColorCombo->setCurrentIndex(             weekendColorCombo->findText(tr("Red")));     weekendColorLabel = new QLabel(tr("Week&end color:"));     weekendColorLabel->setBuddy(weekendColorCombo);       headerTextFormatCombo = new QComboBox;     headerTextFormatCombo->addItem(tr("Bold"));     headerTextFormatCombo->addItem(tr("Italic"));     headerTextFormatCombo->addItem(tr("Plain"));     headerTextFormatLabel = new QLabel(tr("&Header text:"));     headerTextFormatLabel->setBuddy(headerTextFormatCombo);     firstFridayCheckBox = new QCheckBox(tr("&First Friday in blue"));     mayFirstCheckBox = new QCheckBox(tr("May &1 in red"));       connect(weekdayColorCombo, SIGNAL(currentIndexChanged(int)),             this, SLOT(weekdayFormatChanged()));     connect(weekendColorCombo, SIGNAL(currentIndexChanged(int)),             this, SLOT(weekendFormatChanged()));     connect(headerTextFormatCombo, SIGNAL(currentIndexChanged(const QString &)),             this, SLOT(reformatHeaders()));     connect(firstFridayCheckBox, SIGNAL(toggled(bool)),             this, SLOT(reformatCalendarPage()));     connect(mayFirstCheckBox, SIGNAL(toggled(bool)),             this, SLOT(reformatCalendarPage()));     QHBoxLayout *checkBoxLayout = new QHBoxLayout;     checkBoxLayout->addWidget(firstFridayCheckBox);     checkBoxLayout->addStretch();     checkBoxLayout->addWidget(mayFirstCheckBox);     QGridLayout *outerLayout = new QGridLayout;     outerLayout->addWidget(weekdayColorLabel, 0, 0);     outerLayout->addWidget(weekdayColorCombo, 0, 1);     outerLayout->addWidget(weekendColorLabel, 1, 0);     outerLayout->addWidget(weekendColorCombo, 1, 1);     outerLayout->addWidget(headerTextFormatLabel, 2, 0);     outerLayout->addWidget(headerTextFormatCombo, 2, 1);     outerLayout->addLayout(checkBoxLayout, 3, 0, 1, 2);     textFormatsGroupBox->setLayout(outerLayout);     weekdayFormatChanged();     weekendFormatChanged();     reformatHeaders();     reformatCalendarPage(); } QComboBox *Window::createColorComboBox() {     QComboBox *comboBox = new QComboBox;     comboBox->addItem(tr("Red"), Qt::red);     comboBox->addItem(tr("Blue"), Qt::blue);     comboBox->addItem(tr("Black"), Qt::black);     comboBox->addItem(tr("Magenta"), Qt::magenta);     return comboBox; } #include <QtGui> #include "window.h" int main(int argv, char *args[]) {     QApplication app(argv, args);     Window window;     window.show();     return app.exec(); }