Название: Календарь (григорианский) на любое число
Отправлено: alexu007 от Октябрь 13, 2018, 22:22
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)); }
}
Название: Re: Календарь (григорианский) на любое число
Отправлено: alexu007 от Октябрь 13, 2018, 22:27
Выложу проект, на всякий случай:
|