QDateTimeEdit выбирает последний день каждого месяца

У меня есть QDateTimeEdit, и пользователь должен выбрать с ним дату. Однако мне нужно выбрать последний день каждого месяца. Так, например, если пользователь выбирает 3 марта, я должен установить дату 31 марта.

Я пытаюсь сделать это в слоте сигнала dateChanged(const QDate&). Но когда я вызываю функцию setDate(), слот вызывается еще раз.

Вот пример кода

connect(m_pDateEdit, SIGNAL(dateChanged(const QDate&)), this, SLOT(OnDateChanged(const QDate&)));

void MyClass::OnDateChanged(const QDate& date)
{
    const bool b = m_pDateEdit->blockSignals(true);

    // THIS LINE CAUSES TO THIS SLOT TO BE CALLED TWICE
    m_pDateEdit->setDate(QDate(date.year(), date.month(), date.daysInMonth()));
    CallSomeFunction();

    m_pDateEdit->blockSignals(b)
}

Что-то я пропустил? Любые идеи?

Спасибо за ваше время!


person nabroyan    schedule 02.03.2017    source источник


Ответы (1)


РЕДАКТИРОВАТЬ: поскольку вы не можете просто отключиться, я бы посоветовал вам вместо этого сделать проверку и удалить соединение. Вы можете сделать это :

В конструкторе:

QTimer::singleShot(30, this, SLOT(checkDateChanged()));

Затем в классе:

void MyClass::checkDateChanged()
{
    if (pDateEdit->day() != pDateEdit->daysInMonth())
    {
        m_pDateEdit->setDate(QDate(date.year(), date.month(), date.daysInMonth()));
    }
    CallSomeFunction();
    QTimer::singleShot(30, this, SLOT(checkDateChanged())); // this will create a loop called every 30 ms.

}
person Gabriel de Grimouard    schedule 02.03.2017
comment
На самом деле я тоже это пробовал, но слот почему-то снова вызывается. - person nabroyan; 02.03.2017
comment
хорошо, я обновлю его лучшим ответом. (было бы проще проверить, если бы вы дали мне код, но в остальном это тоже нормально) - person Gabriel de Grimouard; 02.03.2017
comment
На самом деле вы подали мне идею. Я отключаю свой сигнальный слот, затем звоню setDate(), затем звоню singleShot(), который снова подключает мой сигнальный слот. - person nabroyan; 03.03.2017
comment
Это работает, но я думаю, что это не деликатное решение, и было бы неплохо решить это более простым способом. - person nabroyan; 03.03.2017
comment
Лучшим способом было бы реализовать свой собственный setDate в своем собственном DateEdit с вашим кодом. Но, как вам кажется, вы не хотели этого делать, я решил отправить вам другое решение, которое проще сделать. - person Gabriel de Grimouard; 03.03.2017