Russian Qt Forum
Апрель 19, 2024, 04:30 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Календарь (григорианский) на любое число  (Прочитано 3604 раз)
alexu007
Чайник
*
Offline Offline

Сообщений: 57


Просмотр профиля
« : Октябрь 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));
        }

}
Записан
alexu007
Чайник
*
Offline Offline

Сообщений: 57


Просмотр профиля
« Ответ #1 : Октябрь 13, 2018, 22:27 »

Выложу проект, на всякий случай:

Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.043 секунд. Запросов: 22.