Qt 4.8 Собсна программа предельно проста и не требует особых пояснений. Для любителей юридических тонкостей: разрешаю любое использование как программы целиком, так и её частей, любые изменения - без ссылок на моё имя.
хедер:
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QDate>
#include <QPlastiqueStyle>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
private:
Ui::Widget *ui;
public slots:
void press_pbtn_01();
};
#endif // WIDGET_H
cpp:
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
QApplication::setStyle(new QPlastiqueStyle());
QStringList name_table;
name_table << "пн" << "вт" << "ср" << "чт" << "пт" << "сб" << "вс";
ui->tableWidget->setHorizontalHeaderLabels(name_table);
// системные месяц и год
QDate dateToday = QDate::currentDate();
ui->spinBox_m->setValue(dateToday.month());
ui->spinBox_y->setValue(dateToday.year());
for(int i = 0; i < 6; i++)
for(int j = 0; j < 7; j++)
{
QTableWidgetItem *it = new QTableWidgetItem;
it->setTextAlignment(Qt::AlignCenter);
ui->tableWidget->setItem(i, j, it);
}
QObject::connect(ui->pbtn_01,SIGNAL(clicked()),this,SLOT(press_pbtn_01()));
}
Widget::~Widget()
{
delete ui;
}
/*
Существует довольно простой алгоритм вычисления дня недели для любой даты григорианского календаря позднее 1583 года.
Григорианский календарь начал действовать в 1582 — после 4 октября сразу настало 15 октября.
Положим год — год, месяц — номер месяца, день — день, тогда
a = (14 - месяц) / 12
y = год - a
m = месяц + 12 * a - 2
ДеньНедели = (день + y + y / 4 - y / 100 + y / 400 + (31 * m) / 12) % 7
Все деления целочисленные (остаток отбрасывается).
Результат: 0 — воскресенье, 1 — понедельник и т. д.
*/
void Widget::press_pbtn_01()
{
QStringList monstext;
monstext << "Январь (January)" << "Февраль (February)"
<< "Март (March)" << "Апрель (April)"
<< "Май (May)" << "Июнь (June)"
<< "Июль (July)" << "Август (August)"
<< "Сентябрь (September)" << "Октябрь (October)"
<< "Ноябрь (November)" << "Декабрь (December)";
int md[12] = {30,27,30,29,30,29,30,30,29,30,29,30};
int days = 1;
int mons = ui->spinBox_m->value();
int year = ui->spinBox_y->value();
int a = (14 - mons)/12;
int y = year - a;
int m = mons - 2 + 12*a;
int x = (days + y + y/4 - y/100 + y/400 + (31*m)/12) % 7;
// високосный год
if((!(year % 4)&&(year % 100))||(!(year % 400))) md[1]++;
ui->label_01->setText(monstext.at(mons-1) + ", " +
QString::number(year));
a = 0;
y = 0;
if(!x) x = 7;
for(int i = 0; i < 6; i++)
for(int j = 0; j < 7; j++)
{
ui->tableWidget->item(i, j)->setText("");
if(++a < x) continue;
if(a > (x + md[mons-1])) continue;
ui->tableWidget->item(i, j)->setText(QString::number(++y));
}
}