头文件
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QDate>
#include <QComboBox>
#include <QGroupBox>
#include <QGridLayout>
#include <QCalendarWidget>
#include <QLabel>
#include <QCheckBox>
#include <QDateEdit>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
private slots:
void localChanged(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 // WIDGET_H
源文件
#include "widget.h"
#include "ui_widget.h"
#include <QTextCharFormat>
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
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 Widget::localChanged(int index)
{
const QLocale newLocale(localeCombo->itemData(index).toLocale());
calendar->setLocale(newLocale);
int newLocaleFirstDayIndex = firstDayCombo->findData(newLocale.firstDayOfWeek());
firstDayCombo->setCurrentIndex(newLocaleFirstDayIndex);
}
void Widget::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, &QCalendarWidget::currentPageChanged, this, &Widget::reformatCalendarPage);
previewLayout = new QGridLayout;
previewLayout->addWidget(calendar, 0, 0, Qt::AlignCenter);
previewGroupBox->setLayout(previewLayout);
}
void Widget::createGeneralOptionsGroupBox()
{
generalOptionsGroupBox = new QGroupBox(tr("General Options"));
localeCombo = new QComboBox;
int currentLocalIndex = -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) {
currentLocalIndex = index;
}
localeCombo->addItem(label, locale);
++index;
}
}
if (currentLocalIndex != -1) {
localeCombo->setCurrentIndex(currentLocalIndex);
}
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, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &Widget::localChanged);
connect(firstDayCombo, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &Widget::firstDayChanged);
connect(selectionModeCombo, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &Widget::selectionModeChanged);
connect(gridCheckBox, &QCheckBox::toggled, calendar, &QCalendarWidget::setGridVisible);
connect(navigationCheckBox, &QCheckBox::toggled, calendar, &QCalendarWidget::setNavigationBarVisible);
connect(horizontalHeaderCombo, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &Widget::horizontalHeaderChanged);
connect(verticalHeaderCombo, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &Widget::verticalHeaderChanged);
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 Widget::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, &QDateEdit::dateChanged, calendar, &QCalendarWidget::setSelectedDate);
connect(calendar, &QCalendarWidget::selectionChanged, this, &Widget::selectedDateChanged);
connect(minimumDateEdit, &QDateEdit::dateChanged, this, &Widget::minimumDateChanged);
connect(maximumDateEdit, &QDateEdit::dateChanged, this, &Widget::maximumDateChanged);
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 Widget::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, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &Widget::weekdayFormatChanged);
connect(weekdayColorCombo, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &Widget::reformatCalendarPage);
connect(weekendColorCombo, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &Widget::weekendFormatChanged);
connect(weekendColorCombo, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &Widget::reformatCalendarPage);
connect(headerTextFormatCombo, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &Widget::reformatHeaders);
connect(firstFridayCheckbox, &QCheckBox::toggled, this, &Widget::reformatCalendarPage);
connect(mayFirstCheckBox, &QCheckBox::toggled, this, &Widget::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 *Widget::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;
}
void Widget::firstDayChanged(int index)
{
calendar->setFirstDayOfWeek(Qt::DayOfWeek(firstDayCombo->itemData(index).toInt()));
}
void Widget::selectionModeChanged(int index)
{
calendar->setSelectionMode(QCalendarWidget::SelectionMode(selectionModeCombo->itemData(index).toInt()));
}
void Widget::horizontalHeaderChanged(int index)
{
calendar->setHorizontalHeaderFormat(QCalendarWidget::HorizontalHeaderFormat(horizontalHeaderCombo->itemData(index).toInt()));
}
void Widget::verticalHeaderChanged(int index)
{
calendar->setVerticalHeaderFormat(QCalendarWidget::VerticalHeaderFormat(verticalHeaderCombo->itemData(index).toInt()));
}
void Widget::selectedDateChanged()
{
currentDateEdit->setDate(calendar->selectedDate());
}
void Widget::minimumDateChanged(const QDate &date)
{
calendar->setMinimumDate(date);
maximumDateEdit->setDate(calendar->maximumDate());
}
void Widget::maximumDateChanged(const QDate &date)
{
calendar->setMaximumDate(date);
minimumDateEdit->setDate(calendar->minimumDate());
}
void Widget::weekdayFormatChanged()
{
QTextCharFormat format;
format.setForeground(qvariant_cast<QColor>(weekendColorCombo->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 Widget::weekendFormatChanged()
{
QTextCharFormat format;
format.setForeground(qvariant_cast<QColor>(weekendColorCombo->itemData(weekendColorCombo->currentIndex())));
calendar->setWeekdayTextFormat(Qt::Saturday, format);
calendar->setWeekdayTextFormat(Qt::Sunday, format);
}
void Widget::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 Widget::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 {
Qt::DayOfWeek dayOfWeek(static_cast<Qt::DayOfWeek>(firstFriday.dayOfWeek()));
firstFridayFormat.setForeground(calendar->weekdayTextFormat(dayOfWeek).foreground());
}
calendar->setDateTextFormat(firstFriday, firstFridayFormat);
if (mayFirstCheckBox->isChecked()) {
mayFirstFormat.setForeground(Qt::red);
} else if (!firstFridayCheckbox->isChecked() || firstFriday != mayFirst) {
Qt::DayOfWeek dayOfWeek(static_cast<Qt::DayOfWeek>(mayFirst.dayOfWeek()));
calendar->setDateTextFormat(mayFirst, calendar->weekdayTextFormat(dayOfWeek));
}
calendar->setDateTextFormat(mayFirst, mayFirstFormat);
}
Widget::~Widget()
{
}
效果