Mega Code Archive

 
Categories / C++ / Qt
 

QTextFrame based calendar

/**************************************************************************** ** ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial Usage ** Licensees holding valid Qt Commercial licenses may use this file in ** accordance with the Qt Commercial License Agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Nokia. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file.  Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Nokia gives you certain additional ** rights.  These rights are described in the Nokia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file.  Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: http://www.gnu.org/copyleft/gpl.html. ** ** If you have questions regarding the use of this file, please contact ** Nokia at qt-info@nokia.com. ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QDate> #include <QMainWindow> QT_BEGIN_NAMESPACE class QTextBrowser; QT_END_NAMESPACE class MainWindow : public QMainWindow {     Q_OBJECT public:     MainWindow(); public slots:     void setFontSize(int size);     void setMonth(int month);     void setYear(QDate date); private:     void insertCalendar();     int fontSize;     QDate selectedDate;     QTextBrowser *editor; }; #endif #include <QtGui> #include "mainwindow.h" 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);     fontSizeSpinBox->setValue(10);     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)));     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(); } #include <QtGui> #include "mainwindow.h" int main(int argc, char *argv[]) {     QApplication app(argc, argv);     MainWindow window;     window.resize(640, 256);     window.show();     return app.exec(); }