2017-03-02 59 views
0

我有一个QDateTimeEdit,用户应该选择一个日期。但是,我需要选择每个月的最后一天。因此,例如,如果用户选择3月3日,我应该将日期设置为3月31日。QDateTimeEdit选择每个月的最后一天

我尝试在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) 
} 

什么我失踪?有任何想法吗?

谢谢你的时间!

回答

0

编辑:因为你不能只是做一个断开连接我会建议你做一个检查,而不是删除连接。你可以这样做:

在构造函数中:

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. 

} 
+0

其实我已尝试为好,但不知何故槽被再次调用。 – nabroyan

+0

好的,我会用更好的答案更新它。 (如果你给我的代码测试会更容易,但其他方面也可以) –

+0

其实你给了我一个主意。我断开我的信号插槽,然后调用'setDate()',然后调用连接我的信号插槽的'singleShot()'。 – nabroyan

相关问题