emit QAbstractSlider::valueChanged() only on value change

The signal has been emitted also, when the slider position has changed
without a value change (e.g. on QWidget::show() or on resizing).

This patch stops emitting the signal without a value change.
It adds a verification to tst_QAbstractSlider::setValue(), that
valueChanged is not emitted on a no-op value change.

As a drive-by, the patch removes an unnecessary assignment and
changes signal spy constructions to PTMF syntax.

Pick-to: 6.5 6.4 6.2
Task-number: QTBUG-25365
Change-Id: I9932e45d4e680aa53422ca75aa42a16306213a38
Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
bb10
Axel Spoerl 2023-03-13 09:16:06 +01:00
parent f4d897f04e
commit 8b84374892
2 changed files with 16 additions and 5 deletions

View File

@ -498,18 +498,25 @@ void QAbstractSlider::setValue(int value)
value = d->bound(value);
if (d->value == value && d->position == value)
return;
// delay signal emission until sliderChanged() has been called
const bool emitValueChanged = (value != d->value);
d->value = value;
if (d->position != value) {
d->position = value;
if (d->pressed)
emit sliderMoved((d->position = value));
emit sliderMoved(d->position);
}
#if QT_CONFIG(accessibility)
QAccessibleValueChangeEvent event(this, d->value);
QAccessible::updateAccessibility(&event);
#endif
sliderChange(SliderValueChange);
emit valueChanged(value);
if (emitValueChanged)
emit valueChanged(value);
}
/*!

View File

@ -2021,9 +2021,9 @@ void tst_QAbstractSlider::setValue()
slider->setRange(minimum, maximum);
slider->setSliderDown(down);
slider->setValue(49); // to force a valueChanged() below
QSignalSpy spy1(slider, SIGNAL(sliderMoved(int)));
QSignalSpy spy2(slider, SIGNAL(valueChanged(int)));
QSignalSpy spy3(slider, SIGNAL(actionTriggered(int)));
QSignalSpy spy1(slider, &QAbstractSlider::sliderMoved);
QSignalSpy spy2(slider, &QAbstractSlider::valueChanged);
QSignalSpy spy3(slider, &QAbstractSlider::actionTriggered);
slider->setValue(50);
QCOMPARE(spy1.size(), down ? 1 : 0);
QCOMPARE(spy2.size(), 1);
@ -2032,6 +2032,10 @@ void tst_QAbstractSlider::setValue()
QCOMPARE(slider->sliderPosition(), reportedSliderPosition);
if (down)
QVERIFY(sliderMovedTimeStamp < valueChangedTimeStamp);
slider->setValue(50);
QApplication::processEvents();
QCOMPARE(spy2.size(), 1);
}
void tst_QAbstractSlider::waitUntilTimeElapsed(const QElapsedTimer &t, int ms)