window.cpp 范例文件
					 
					
						widgets/calendarwidget/window.cpp
					 
					
/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the examples of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:BSD$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** BSD License Usage
** Alternatively, you may use this file under the terms of the BSD license
** as follows:
**
** "Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions are
** met:
**   * Redistributions of source code must retain the above copyright
**     notice, this list of conditions and the following disclaimer.
**   * Redistributions in binary form must reproduce the above copyright
**     notice, this list of conditions and the following disclaimer in
**     the documentation and/or other materials provided with the
**     distribution.
**   * Neither the name of The Qt Company Ltd nor the names of its
**     contributors may be used to endorse or promote products derived
**     from this software without specific prior written permission.
**
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
**
** $QT_END_LICENSE$
**
****************************************************************************/ 
#include <QtWidgets> 
#include "window.h" 
Window:: Window()
{
    createPreviewGroupBox();
    createGeneralOptionsGroupBox();
    createDatesGroupBox();
    createTextFormatsGroupBox();
    QGridLayout * layout =  new  QGridLayout - > 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)
{
    const  QLocale - > itemData(index). toLocale());
    calendar- > setLocale(newLocale);
    int  newLocaleFirstDayIndex =  firstDayCombo- > findData(newLocale. firstDayOfWeek());
    firstDayCombo- > setCurrentIndex(newLocaleFirstDayIndex);
}
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 . 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 . setForeground(qvariant_cast< QColor > (
        weekendColorCombo- > itemData(weekendColorCombo- > currentIndex())));
    calendar- > setWeekdayTextFormat(Qt :: Saturday,  format);
    calendar- > setWeekdayTextFormat(Qt :: Sunday,  format);
}
void  Window:: reformatHeaders()
{
    QString =  headerTextFormatCombo- > currentText();
    QTextCharFormat 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 const  QDate - > yearShown(),  5 ,  1 );
    QTextCharFormat QDate - > yearShown(),  calendar- > monthShown(),  1 );
    while  (firstFriday. dayOfWeek() ! =  Qt :: Friday)
        firstFriday =  firstFriday. addDays(1 );
    if  (firstFridayCheckBox- > isChecked()) {
        firstFridayFormat. setForeground(Qt :: blue);
    } else  { // Revert to regular colour for this day of the week. 
        Qt :: DayOfWeek dayOfWeek(static_cast < Qt :: DayOfWeek> (firstFriday. dayOfWeek()));
        firstFridayFormat. setForeground(calendar- > weekdayTextFormat(dayOfWeek). foreground());
    }
    calendar- > setDateTextFormat(firstFriday,  firstFridayFormat);
    // When it is checked, "May First in Red" always takes precedence over "First Friday in Blue". 
    if  (mayFirstCheckBox- > isChecked()) {
        mayFirstFormat. setForeground(Qt :: red);
    } else  if  (! firstFridayCheckBox- > isChecked() | |  firstFriday ! =  mayFirst) {
        // We can now be certain we won't be resetting "May First in Red" when we restore 
        // may 1st's regular colour for this day of the week. 
        Qt :: DayOfWeek dayOfWeek(static_cast < Qt :: DayOfWeek> (mayFirst. dayOfWeek()));
        calendar- > setDateTextFormat(mayFirst,  calendar- > weekdayTextFormat(dayOfWeek));
    }
    calendar- > setDateTextFormat(mayFirst,  mayFirstFormat);
}
void  Window:: createPreviewGroupBox()
{
    previewGroupBox =  new  QGroupBox "Preview" ));
    calendar =  new  QCalendarWidget - > 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 - > addWidget(calendar,  0 ,  0 ,  Qt :: AlignCenter);
    previewGroupBox- > setLayout(previewLayout);
}
void  Window:: createGeneralOptionsGroupBox()
{
    generalOptionsGroupBox =  new  QGroupBox "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 =  QLocale :: languageToString(lang);
            label + =  QLatin1Char('/' );
            label + =  QLocale :: countryToString(country);
            QLocale ,  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 "&Locale" ));
    localeLabel- > setBuddy(localeCombo);
    firstDayCombo =  new  QComboBox - > 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 "Wee&k starts on:" ));
    firstDayLabel- > setBuddy(firstDayCombo);
    selectionModeCombo =  new  QComboBox - > addItem(tr("Single selection" ), 
                                QCalendarWidget :: SingleSelection);
    selectionModeCombo- > addItem(tr("None" ),  QCalendarWidget :: NoSelection);
    selectionModeLabel =  new  QLabel "&Selection mode:" ));
    selectionModeLabel- > setBuddy(selectionModeCombo);
    gridCheckBox =  new  QCheckBox "&Grid" ));
    gridCheckBox- > setChecked(calendar- > isGridVisible());
    navigationCheckBox =  new  QCheckBox "&Navigation bar" ));
    navigationCheckBox- > setChecked(true );
    horizontalHeaderCombo =  new  QComboBox - > 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 "&Horizontal header:" ));
    horizontalHeaderLabel- > setBuddy(horizontalHeaderCombo);
    verticalHeaderCombo =  new  QComboBox - > addItem(tr("ISO week numbers" ), 
                                 QCalendarWidget :: ISOWeekNumbers);
    verticalHeaderCombo- > addItem(tr("None" ),  QCalendarWidget :: NoVerticalHeader);
    verticalHeaderLabel =  new  QLabel "&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 - > addWidget(gridCheckBox);
    checkBoxLayout- > addStretch();
    checkBoxLayout- > addWidget(navigationCheckBox);
    QGridLayout * outerLayout =  new  QGridLayout - > 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 "Dates" ));
    minimumDateEdit =  new  QDateEdit - > setDisplayFormat("MMM d yyyy" );
    minimumDateEdit- > setDateRange(calendar- > minimumDate(), 
                                  calendar- > maximumDate());
    minimumDateEdit- > setDate(calendar- > minimumDate());
    minimumDateLabel =  new  QLabel "&Minimum Date:" ));
    minimumDateLabel- > setBuddy(minimumDateEdit);
    currentDateEdit =  new  QDateEdit - > setDisplayFormat("MMM d yyyy" );
    currentDateEdit- > setDate(calendar- > selectedDate());
    currentDateEdit- > setDateRange(calendar- > minimumDate(), 
                                  calendar- > maximumDate());
    currentDateLabel =  new  QLabel "&Current Date:" ));
    currentDateLabel- > setBuddy(currentDateEdit);
    maximumDateEdit =  new  QDateEdit - > setDisplayFormat("MMM d yyyy" );
    maximumDateEdit- > setDateRange(calendar- > minimumDate(), 
                                  calendar- > maximumDate());
    maximumDateEdit- > setDate(calendar- > maximumDate());
    maximumDateLabel =  new  QLabel "Ma&ximum Date:" ));
    maximumDateLabel- > setBuddy(maximumDateEdit);
    connect(currentDateEdit,  SIGNAL(dateChanged(QDate , 
            calendar,  SLOT(setSelectedDate(QDate ,  SIGNAL(selectionChanged()), 
            this ,  SLOT(selectedDateChanged()));
    connect(minimumDateEdit,  SIGNAL(dateChanged(QDate , 
            this ,  SLOT(minimumDateChanged(QDate ,  SIGNAL(dateChanged(QDate , 
            this ,  SLOT(maximumDateChanged(QDate QGridLayout * dateBoxLayout =  new  QGridLayout - > 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 "Text Formats" ));
    weekdayColorCombo =  createColorComboBox();
    weekdayColorCombo- > setCurrentIndex(
            weekdayColorCombo- > findText(tr("Black" )));
    weekdayColorLabel =  new  QLabel "&Weekday color:" ));
    weekdayColorLabel- > setBuddy(weekdayColorCombo);
    weekendColorCombo =  createColorComboBox();
    weekendColorCombo- > setCurrentIndex(
            weekendColorCombo- > findText(tr("Red" )));
    weekendColorLabel =  new  QLabel "Week&end color:" ));
    weekendColorLabel- > setBuddy(weekendColorCombo);
    headerTextFormatCombo =  new  QComboBox - > addItem(tr("Bold" ));
    headerTextFormatCombo- > addItem(tr("Italic" ));
    headerTextFormatCombo- > addItem(tr("Plain" ));
    headerTextFormatLabel =  new  QLabel "&Header text:" ));
    headerTextFormatLabel- > setBuddy(headerTextFormatCombo);
    firstFridayCheckBox =  new  QCheckBox "&First Friday in blue" ));
    mayFirstCheckBox =  new  QCheckBox "May &1 in red" ));
    connect(weekdayColorCombo,  SIGNAL(currentIndexChanged(int )), 
            this ,  SLOT(weekdayFormatChanged()));
    connect(weekdayColorCombo,  SIGNAL(currentIndexChanged(int )), 
            this ,  SLOT(reformatCalendarPage()));
    connect(weekendColorCombo,  SIGNAL(currentIndexChanged(int )), 
            this ,  SLOT(weekendFormatChanged()));
    connect(weekendColorCombo,  SIGNAL(currentIndexChanged(int )), 
            this ,  SLOT(reformatCalendarPage()));
    connect(headerTextFormatCombo,  SIGNAL(currentIndexChanged(QString , 
            this ,  SLOT(reformatHeaders()));
    connect(firstFridayCheckBox,  SIGNAL(toggled(bool)), 
            this ,  SLOT(reformatCalendarPage()));
    connect(mayFirstCheckBox,  SIGNAL(toggled(bool)), 
            this ,  SLOT(reformatCalendarPage()));
    QHBoxLayout * checkBoxLayout =  new  QHBoxLayout - > addWidget(firstFridayCheckBox);
    checkBoxLayout- > addStretch();
    checkBoxLayout- > addWidget(mayFirstCheckBox);
    QGridLayout * outerLayout =  new  QGridLayout - > 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 - > addItem(tr("Red" ),  QColor Qt :: red));
    comboBox- > addItem(tr("Blue" ),  QColor Qt :: blue));
    comboBox- > addItem(tr("Black" ),  QColor Qt :: black));
    comboBox- > addItem(tr("Magenta" ),  QColor Qt :: magenta));
    return  comboBox;
}