Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Ввод/Вывод, Сеть. Межпроцессное взаимодействие _ Цикл по датам

Автор: OlejOK 5.2.2019, 13:43

Как можно сделать цикл от даты которую беру в dateEdit до даты которую беру в dateEdit_2 ?
Если увеличивать значение в самом dateEdit с помощью stepUp(), то это прокатывает только в пределах одного месяца. stepUp() на следующий месяц не переходит, упирается в последний день.
Подскажите пожалуйста, какой можно использовать тип данных чтобы записать в него значения даты и сделать цикл по дням, или как увеличивать значение самого dateEdit, но чтобы осуществлялся в том числе переход на следующий месяц и в последствии год.
Пока что накостылил вот так, но как уже написал выше, если месяца разные, то все ломается.

void MainWindow2::on_pushButton_clicked()
{
    const int rowCount = ui->tableView->model()->rowCount();
    int countI=0;
    int countK=0;
    ui->label_3->setStyleSheet("color: rgb(0,0,200)");
    ui->label_3->setText("Отчет с "+ui->dateEdit->text()+" по "+ui->dateEdit_2->text()+" сформирован:");
    ui->dateEdit_2->stepUp();
    while (ui->dateEdit->date()<ui->dateEdit_2->date()) {
        for (int i = 0; i < rowCount; i++) {
            QString str=ui->tableView->model()->data(ui->tableView->model()->index(i,0)).toString();
            QString str2=ui->dateEdit->text();
            QString str3=ui->tableView->model()->data(ui->tableView->model()->index(i,9)).toString();
            QString str4="инцидент";
            if (str==str2) {
                if (str3==str4) {
                    countI++;
                }
                else {
                    countK++;
                }
            }
        }
        ui->dateEdit->stepUp();
    }
    QString str1 = QString::number(countI);
    QString str2 = QString::number(countK);
    ui->lineEdit->setText(str1);
    ui->lineEdit_2->setText(str2);
    ui->dateEdit->setDate(QDate::currentDate());
    ui->dateEdit_2->setDate(QDate::currentDate());
}

Автор: Litkevich Yuriy 5.2.2019, 14:17

Из кода не понятно, что должно делаться. Для чего проверяется условие не равенства дат? Во внутреннем цикле дата никак не используется.

Не оставляй умалчиваемых имён виджетов, они ни о чём не говорят, давай им осмысленные имена

Автор: OlejOK 5.2.2019, 14:52

Цитата(Litkevich Yuriy @ 5.2.2019, 14:17) *
Из кода не понятно, что должно делаться. Для чего проверяется условие не равенства дат? Во внутреннем цикле дата никак не используется.

Не оставляй умалчиваемых имён виджетов, они ни о чём не говорят, давай им осмысленные имена

Используется. Беру данные из ячеек tableView и помещаю в str и сравниваю с str2, в котором как раз дата из dateEdit
QString str=ui->tableView->model()->data(ui->tableView->model()->index(i,0)).toString();
QString str2=ui->dateEdit->text();
...
if (str==str2) {
     if (str3==str4) {
         countI++;
     }
     else {
         countK++;
     }
}

Автор: OlejOK 5.2.2019, 14:55

Цитата(Litkevich Yuriy @ 5.2.2019, 14:17) *
Из кода не понятно, что должно делаться. Для чего проверяется условие не равенства дат? Во внутреннем цикле дата никак не используется.

Не оставляй умалчиваемых имён виджетов, они ни о чём не говорят, давай им осмысленные имена

Основной вопрос у меня в том как сделать цикл от даты из одного dateEdit до даты в другом dateEdit

Автор: Алексей1153 6.2.2019, 9:37

Гость_OlejOK_ что понимается под "цикл от даты до даты" ? Шаг по дням/месяцам ?
Смотри функции

QDateTime addDays(qint64 ndays) const
QDateTime addMSecs(qint64 msecs) const
QDateTime addMonths(int nmonths) const
QDateTime addSecs(qint64 s) const
QDateTime addYears(int nyears) const


сравнивать даты лучше оператором QDateTime::operator= либо по значениям QDateTime::toSecsSinceEpoch()

Автор: OlejOK 6.2.2019, 12:49

Нашел решение

    QDate date;
    date.setDate(ui->dateEdit->date().year(),ui->dateEdit->date().month(),ui->dateEdit->date().day());
    QDate date2;
    date2.setDate(ui->dateEdit_2->date().year(),ui->dateEdit_2->date().month(),ui->dateEdit_2->date().day());
    while (date<date2) {
        ...
        date = date.addDays(+1);

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)