| /**************************************************************************** |
| ** |
| ** 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 "mainwindow.h" |
| |
| #include <QtWidgets> |
| |
| //! [0] |
| MainWindow::MainWindow() |
| { |
| selectedDate = QDate::currentDate(); |
| fontSize = 10; |
| |
| QWidget *centralWidget = new QWidget; |
| //! [0] |
| |
| //! [1] |
| QLabel *dateLabel = new QLabel(tr("Date:")); |
| QComboBox *monthCombo = new QComboBox; |
| |
| for (int month = 1; month <= 12; ++month) |
| monthCombo->addItem(QLocale::system().monthName(month)); |
| |
| QDateTimeEdit *yearEdit = new QDateTimeEdit; |
| yearEdit->setDisplayFormat("yyyy"); |
| yearEdit->setDateRange(QDate(1753, 1, 1), QDate(8000, 1, 1)); |
| //! [1] |
| |
| monthCombo->setCurrentIndex(selectedDate.month() - 1); |
| yearEdit->setDate(selectedDate); |
| |
| //! [2] |
| QLabel *fontSizeLabel = new QLabel(tr("Font size:")); |
| QSpinBox *fontSizeSpinBox = new QSpinBox; |
| fontSizeSpinBox->setRange(1, 64); |
| |
| editor = new QTextBrowser; |
| insertCalendar(); |
| //! [2] |
| |
| //! [3] |
| connect(monthCombo, QOverload<int>::of(&QComboBox::activated), |
| this, &MainWindow::setMonth); |
| connect(yearEdit, &QDateTimeEdit::dateChanged, |
| this, &MainWindow::setYear); |
| connect(fontSizeSpinBox, QOverload<int>::of(&QSpinBox::valueChanged), |
| this, &MainWindow::setFontSize); |
| //! [3] |
| |
| fontSizeSpinBox->setValue(10); |
| |
| //! [4] |
| 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); |
| //! [4] |
| } |
| |
| //! [5] |
| void MainWindow::insertCalendar() |
| { |
| editor->clear(); |
| QTextCursor cursor = editor->textCursor(); |
| cursor.beginEditBlock(); |
| |
| QDate date(selectedDate.year(), selectedDate.month(), 1); |
| //! [5] |
| |
| //! [6] |
| QTextTableFormat tableFormat; |
| tableFormat.setAlignment(Qt::AlignHCenter); |
| tableFormat.setBackground(QColor("#e0e0e0")); |
| tableFormat.setCellPadding(2); |
| tableFormat.setCellSpacing(4); |
| //! [6] //! [7] |
| 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); |
| //! [7] |
| |
| //! [8] |
| QTextTable *table = cursor.insertTable(1, 7, tableFormat); |
| //! [8] |
| |
| //! [9] |
| QTextFrame *frame = cursor.currentFrame(); |
| QTextFrameFormat frameFormat = frame->frameFormat(); |
| frameFormat.setBorder(1); |
| frame->setFrameFormat(frameFormat); |
| //! [9] |
| |
| //! [10] |
| QTextCharFormat format = cursor.charFormat(); |
| format.setFontPointSize(fontSize); |
| |
| QTextCharFormat boldFormat = format; |
| boldFormat.setFontWeight(QFont::Bold); |
| |
| QTextCharFormat highlightedFormat = boldFormat; |
| highlightedFormat.setBackground(Qt::yellow); |
| //! [10] |
| |
| //! [11] |
| for (int weekDay = 1; weekDay <= 7; ++weekDay) { |
| QTextTableCell cell = table->cellAt(0, weekDay-1); |
| //! [11] //! [12] |
| QTextCursor cellCursor = cell.firstCursorPosition(); |
| cellCursor.insertText(QLocale::system().dayName(weekDay), boldFormat); |
| } |
| //! [12] |
| |
| //! [13] |
| table->insertRows(table->rows(), 1); |
| //! [13] |
| |
| 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(); |
| //! [14] |
| setWindowTitle(tr("Calendar for %1 %2" |
| ).arg(QLocale::system().monthName(selectedDate.month()) |
| ).arg(selectedDate.year())); |
| } |
| //! [14] |
| |
| //! [15] |
| void MainWindow::setFontSize(int size) |
| { |
| fontSize = size; |
| insertCalendar(); |
| } |
| //! [15] |
| |
| //! [16] |
| void MainWindow::setMonth(int month) |
| { |
| selectedDate = QDate(selectedDate.year(), month + 1, selectedDate.day()); |
| insertCalendar(); |
| } |
| //! [16] |
| |
| //! [17] |
| void MainWindow::setYear(QDate date) |
| { |
| selectedDate = QDate(date.year(), selectedDate.month(), selectedDate.day()); |
| insertCalendar(); |
| } |
| //! [17] |