- Qt 5.5
- Qt Widgets
- Calendar Example
- mainwindow.cpp Example File
- Qt 5.5.1 Reference Documentation

# mainwindow.cpp Example File

richtext/calendar/mainwindow.cpp

    /****************************************************************************
    **
    ** Copyright (C) 2015 The Qt Company Ltd.
    ** Contact: http://www.qt.io/licensing/
    **
    ** This file is part of the examples of the Qt Toolkit.
    **
    ** $QT_BEGIN_LICENSE:BSD$
    ** 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 "mainwindow.h"

    #include <QtWidgets>

    MainWindow::MainWindow()
    {
        selectedDate = QDate::currentDate();
        fontSize = 10;

        QWidget *centralWidget = new QWidget;

        QLabel *dateLabel = new QLabel(tr("Date:"));
        QComboBox *monthCombo = new QComboBox;

        for (int month = 1; month <= 12; ++month)
            monthCombo->addItem(QDate::longMonthName(month));

        QDateTimeEdit *yearEdit = new QDateTimeEdit;
        yearEdit->setDisplayFormat("yyyy");
        yearEdit->setDateRange(QDate(1753, 1, 1), QDate(8000, 1, 1));

        monthCombo->setCurrentIndex(selectedDate.month() - 1);
        yearEdit->setDate(selectedDate);

        QLabel *fontSizeLabel = new QLabel(tr("Font size:"));
        QSpinBox *fontSizeSpinBox = new QSpinBox;
        fontSizeSpinBox->setRange(1, 64);

        editor = new QTextBrowser;
        insertCalendar();

        connect(monthCombo, SIGNAL(activated(int)), this, SLOT(setMonth(int)));
        connect(yearEdit, SIGNAL(dateChanged(QDate)), this, SLOT(setYear(QDate)));
        connect(fontSizeSpinBox, SIGNAL(valueChanged(int)),
                this, SLOT(setFontSize(int)));

        fontSizeSpinBox->setValue(10);

        QHBoxLayout *controlsLayout = new QHBoxLayout;
        controlsLayout->addWidget(dateLabel);
        controlsLayout->addWidget(monthCombo);
        controlsLayout->addWidget(yearEdit);
        controlsLayout->addSpacing(24);
        controlsLayout->addWidget(fontSizeLabel);
        controlsLayout->addWidget(fontSizeSpinBox);
        controlsLayout->addStretch(1);

        QVBoxLayout *centralLayout = new QVBoxLayout;
        centralLayout->addLayout(controlsLayout);
        centralLayout->addWidget(editor, 1);
        centralWidget->setLayout(centralLayout);

        setCentralWidget(centralWidget);
    }

    void MainWindow::insertCalendar()
    {
        editor->clear();
        QTextCursor cursor = editor->textCursor();
        cursor.beginEditBlock();

        QDate date(selectedDate.year(), selectedDate.month(), 1);

        QTextTableFormat tableFormat;
        tableFormat.setAlignment(Qt::AlignHCenter);
        tableFormat.setBackground(QColor("#e0e0e0"));
        tableFormat.setCellPadding(2);
        tableFormat.setCellSpacing(4);
        QVector<QTextLength> constraints;
        constraints << QTextLength(QTextLength::PercentageLength, 14)
                    << QTextLength(QTextLength::PercentageLength, 14)
                    << QTextLength(QTextLength::PercentageLength, 14)
                    << QTextLength(QTextLength::PercentageLength, 14)
                    << QTextLength(QTextLength::PercentageLength, 14)
                    << QTextLength(QTextLength::PercentageLength, 14)
                    << QTextLength(QTextLength::PercentageLength, 14);
        tableFormat.setColumnWidthConstraints(constraints);

        QTextTable *table = cursor.insertTable(1, 7, tableFormat);

        QTextFrame *frame = cursor.currentFrame();
        QTextFrameFormat frameFormat = frame->frameFormat();
        frameFormat.setBorder(1);
        frame->setFrameFormat(frameFormat);

        QTextCharFormat format = cursor.charFormat();
        format.setFontPointSize(fontSize);

        QTextCharFormat boldFormat = format;
        boldFormat.setFontWeight(QFont::Bold);

        QTextCharFormat highlightedFormat = boldFormat;
        highlightedFormat.setBackground(Qt::yellow);

        for (int weekDay = 1; weekDay <= 7; ++weekDay) {
            QTextTableCell cell = table->cellAt(0, weekDay-1);
            QTextCursor cellCursor = cell.firstCursorPosition();
            cellCursor.insertText(QString("%1").arg(QDate::longDayName(weekDay)), boldFormat);
        }

        table->insertRows(table->rows(), 1);

        while (date.month() == selectedDate.month()) {
            int weekDay = date.dayOfWeek();
            QTextTableCell cell = table->cellAt(table->rows()-1, weekDay-1);
            QTextCursor cellCursor = cell.firstCursorPosition();

            if (date == QDate::currentDate())
                cellCursor.insertText(QString("%1").arg(date.day()), highlightedFormat);
            else
                cellCursor.insertText(QString("%1").arg(date.day()), format);

            date = date.addDays(1);
            if (weekDay == 7 && date.month() == selectedDate.month())
                table->insertRows(table->rows(), 1);
        }

        cursor.endEditBlock();
        setWindowTitle(tr("Calendar for %1 %2"
            ).arg(QDate::longMonthName(selectedDate.month())
            ).arg(selectedDate.year()));
    }

    void MainWindow::setFontSize(int size)
    {
        fontSize = size;
        insertCalendar();
    }

    void MainWindow::setMonth(int month)
    {
        selectedDate = QDate(selectedDate.year(), month + 1, selectedDate.day());
        insertCalendar();
    }

    void MainWindow::setYear(QDate date)
    {
        selectedDate = QDate(date.year(), selectedDate.month(), selectedDate.day());
        insertCalendar();
    }