QDateEdit的dataChanged信号槽执行2次问题

QDateEdit的dataChanged信号槽执行2次问题

要实现修改日期,当不是指定条件时(今天),报错,并将其值设置有效(今天),代码如下

connect(ui -> dateEdit, SIGNAL(dateChanged(QDate)),  this , SLOT(date1(QDate)));

void  TestUI::date1( const  QDate  &  date)
{
    
if (date != QDate::currentDate())
    
{
        ui
->dateEdit->blockSignals(true);
        QMessageBox::warning(
this"a", QString::number(b));
        ui
->dateEdit->setDate(QDate::currentDate());
        ui
->dateEdit->blockSignals(false);
    }

}


结果:当不满足条件时,弹出框弹了2次。

跟踪代码:

void  QAbstractSpinBoxPrivate::setValue( const  QVariant  & val, EmitPolicy ep,
                                       
bool  doUpdate)
{
    Q_Q(QAbstractSpinBox);
    
const QVariant old = value;
    value 
= bound(val);
    pendingEmit 
= false;
    cleared 
= false;
    
if (doUpdate) {
        updateEdit();
    }

    q
->update();

    
if (ep == AlwaysEmit || (ep == EmitIfChanged && old != value)) {
        emitSignals(ep, old);
    }

}

在updateEdit();(设置新值)之后又执行了emitSignals(ep, old); 这里再次发送了信号
void  QDateTimeEditPrivate::emitSignals(EmitPolicy ep,  const  QVariant  & old)
{
    Q_Q(QDateTimeEdit);
    
if (ep == NeverEmit) {
        
return;
    }

    pendingEmit 
= false;

    
const bool dodate = value.toDate().isValid() && (sections & DateSectionMask);
    
const bool datechanged = (ep == AlwaysEmit || old.toDate() != value.toDate());
    
const bool dotime = value.toTime().isValid() && (sections & TimeSectionMask);
    
const bool timechanged = (ep == AlwaysEmit || old.toTime() != value.toTime());

    updateCache(value, displayText());

    syncCalendarWidget();
    
if (datechanged || timechanged)
        emit q
->dateTimeChanged(value.toDateTime());
    
if (dodate && datechanged)
        emit q
->dateChanged(value.toDate());
    
if (dotime && timechanged)
        emit q
->timeChanged(value.toTime());

}

很可能是这里让其再执行槽函数。
官方也给出了这个bug: http://bugreports.qt.nokia.com/browse/QTBUG-10220
解决办法
1  修改QDateTimeEditPrivate::emitSignals,使其不发送信号。(未做测试)
2  修改我的代码,加个变量判断其状态,只有在第一次执行槽函数时做弹出框,代码如下:
void  TestUI::date1( const  QDate  &  date)
{
    ui
->dateEdit->blockSignals(true);
    
if (b)
    
{
        QMessageBox::warning(
this"a", QString::number(b));
        ui
->dateEdit->setDate(QDate::currentDate());
        b 
= false;
    }

    
else
    
{
        ui
->dateEdit->setDate(QDate::currentDate());
        b 
= true;
    }

    ui
->dateEdit->blockSignals(false);
}

注意:2个分支里都要重新设置日期!

你可能感兴趣的:(QDateEdit的dataChanged信号槽执行2次问题)