1

我有一个 QDateTimeEdit,用户应该选择一个日期。但是,我需要选择每个月的最后一天。因此,例如,如果用户选择 3 月 3 日,我应该将日期设置为 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)
}

有什么我想念的吗?有任何想法吗?

感谢您的时间!

4

1 回答 1

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.

}
于 2017-03-02T16:13:25.257 回答