【问题标题】:QDateTimeEdit select last day of each monthQDateTimeEdit 选择每个月的最后一天
【发布时间】:2017-03-02 16:05:59
【问题描述】:

我有一个 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)
}

我缺少什么吗?有什么想法吗?

感谢您的宝贵时间!

【问题讨论】:

    标签: c++ qt signals-slots qt-signals qdatetime


    【解决方案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.
    
    }
    

    【讨论】:

    • 其实我也试过了,但不知何故再次调用了插槽。
    • 好的,我会用更好的答案更新它。 (如果你给我代码会更容易测试,否则也可以)
    • 其实你给了我一个想法。我断开我的信号槽,然后调用setDate(),然后调用singleShot(),它连接回我的信号槽。
    • 这行得通,但我认为这不是一个微妙的解决方案,用这种更直接的方式解决会很好。
    • 更好的方法是使用您的代码在您自己的 DateEdit 中实现您自己的 setDate。但是您似乎不想这样做,我选择向您发送另一个更容易做到的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2019-01-20
    • 1970-01-01
    • 2017-05-03
    • 2019-01-31
    • 2018-09-21
    • 2021-01-23
    • 1970-01-01
    • 2014-10-25
    相关资源
    最近更新 更多