tst_QAbstractSlider: add a check for sliderChange() "emission"

QAbstractSlider::sliderChange() is not a signal, but a protected
function, carrying an enum (also protected) to inform subclasses about
changes in the base class.

A user reported (QTBUG-135597) that in 5.15 the function was not
called for SliderOrientationChange.

Add a test that verfies that the function is a) called for all other
enum values and b) add XFAILs for the (still) missing
SliderOrientationChange.

Amends the start of the public history.

Pick-to: 6.9 6.8 6.5 5.15
Task-number: QTBUG-135597
Change-Id: I959077f030976937dd279897748025afa06e74dd
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
This commit is contained in:
Marc Mutz 2025-04-03 17:09:35 +02:00
parent 847c0bf076
commit f4e892d797

View File

@ -3,11 +3,14 @@
#include <QTest>
#include <QAbstractSlider>
#include <QtWidgets/qdial.h>
#include <QScrollBar>
#include <QSlider>
#include <QStyle>
#include <QStyleOption>
#include <QElapsedTimer>
#include <QDebug>
#include <QSignalSpy>
@ -66,7 +69,13 @@ private slots:
void setRepeatAction();
void connectedSliders();
void sliderChange_QDial() { sliderChange_impl<QDial>(); }
void sliderChange_QScrollBar() { sliderChange_impl<QScrollBar>(); }
void sliderChange_QSlider() { sliderChange_impl<QSlider>(); }
private:
template <typename Slider>
void sliderChange_impl();
void waitUntilTimeElapsed(const QElapsedTimer &t, int ms);
QWidget *topLevel;
@ -2101,5 +2110,58 @@ void tst_QAbstractSlider::connectedSliders()
delete slider2;
}
template<typename Slider>
void tst_QAbstractSlider::sliderChange_impl()
{
struct Tracker : Slider {
using Slider::Slider;
using QAbstractSlider::SliderChange; // make it public
std::vector<QAbstractSlider::SliderChange> changes;
void sliderChange(QAbstractSlider::SliderChange c) override
{
Slider::sliderChange(c);
changes.push_back(c);
}
};
using SliderChange = typename Tracker::SliderChange;
Tracker sl;
QCOMPARE(sl.changes.size(), 0U);
sl.setRange(0, 100'000);
QCOMPARE(sl.changes.size(), 1U);
QCOMPARE(sl.changes.back(), SliderChange::SliderRangeChange);
sl.changes.clear();
sl.setOrientation(sl.orientation() == Qt::Horizontal ? Qt::Vertical
/* else */ : Qt::Horizontal);
QEXPECT_FAIL("", "QTBUG-135597", Continue);
QCOMPARE(sl.changes.size(), 1U);
if (!sl.changes.empty()) {
QEXPECT_FAIL("", "QTBUG-135597", Continue);
QCOMPARE(sl.changes.back(), SliderChange::SliderOrientationChange);
}
sl.changes.clear();
sl.setPageStep(1025); // unlikely to be the default ;)
QCOMPARE(sl.changes.size(), 1U);
QCOMPARE(sl.changes.back(), SliderChange::SliderStepsChange);
sl.changes.clear();
sl.setSingleStep(42); // unlikely to be the default ;)
QCOMPARE(sl.changes.size(), 1U);
QCOMPARE(sl.changes.back(), SliderChange::SliderStepsChange);
sl.changes.clear();
sl.setValue(131); // unlikely to be the default ;)
QCOMPARE(sl.changes.size(), 1U);
QCOMPARE(sl.changes.back(), SliderChange::SliderValueChange);
sl.changes.clear();
}
QTEST_MAIN(tst_QAbstractSlider)
#include "tst_qabstractslider.moc"