要實現修改日期,當不是指定條件時(今天),報錯,并將其值設置有效(今天),代碼如下
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個分支里都要重新設置日期!