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 ;
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)
{
const QLocale newLocale(localeCombo- > 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 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;
const QDate mayFirst(calendar- > yearShown(), 5 , 1 );
QTextCharFormat firstFridayFormat;
QDate firstFriday(calendar- > 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 (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(QDate )),
calendar, SLOT(setSelectedDate(QDate )));
connect(calendar, SIGNAL(selectionChanged()),
this , SLOT(selectedDateChanged()));
connect(minimumDateEdit, SIGNAL(dateChanged(QDate )),
this , SLOT(minimumDateChanged(QDate )));
connect(maximumDateEdit, SIGNAL(dateChanged(QDate )),
this , SLOT(maximumDateChanged(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(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 ;
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" ), 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;
}