QAbstractButton: don't clear 'pressed' flag unless left button is released
As it stood, we would set 'pressed' to false regardless of which button that was released. This would end up wrong if pressing the left button, and at the same time, did a click with the right button. This would clear the flag prematurely, and cause a release signal not to be emitted when later releasing the left button. tst_QAbstractButton: adding autotest Adding tests to simulate the bug report's cases: 1) left press button 2) click right/middle key 3) move mouse out of button's boundary 4) test if the released() signal triggered properly Taks-number: QTBUG-53244 Change-Id: Ifc0d5f52a917ac9cd2df5e86c0475abcda47e425 Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@qt.io>bb10
parent
3dab19ffed
commit
7465329fe1
|
|
@ -991,13 +991,14 @@ void QAbstractButton::mousePressEvent(QMouseEvent *e)
|
|||
void QAbstractButton::mouseReleaseEvent(QMouseEvent *e)
|
||||
{
|
||||
Q_D(QAbstractButton);
|
||||
d->pressed = false;
|
||||
|
||||
if (e->button() != Qt::LeftButton) {
|
||||
e->ignore();
|
||||
return;
|
||||
}
|
||||
|
||||
d->pressed = false;
|
||||
|
||||
if (!d->down) {
|
||||
// refresh is required by QMacStyle to resume the default button animation
|
||||
d->refresh();
|
||||
|
|
|
|||
|
|
@ -68,6 +68,7 @@ private slots:
|
|||
void shortcutEvents();
|
||||
void stopRepeatTimer();
|
||||
|
||||
void mouseReleased(); // QTBUG-53244
|
||||
#ifdef QT_KEYPAD_NAVIGATION
|
||||
void keyNavigation();
|
||||
#endif
|
||||
|
|
@ -563,6 +564,37 @@ void tst_QAbstractButton::stopRepeatTimer()
|
|||
QCOMPARE(button.timerEventCount(), 0);
|
||||
}
|
||||
|
||||
void tst_QAbstractButton::mouseReleased() // QTBUG-53244
|
||||
{
|
||||
MyButton button(nullptr);
|
||||
button.setObjectName("button");
|
||||
button.setGeometry(0, 0, 20, 20);
|
||||
QSignalSpy spyPress(&button, &QAbstractButton::pressed);
|
||||
QSignalSpy spyRelease(&button, &QAbstractButton::released);
|
||||
|
||||
QTest::mousePress(&button, Qt::LeftButton);
|
||||
QCOMPARE(spyPress.count(), 1);
|
||||
QCOMPARE(button.isDown(), true);
|
||||
QCOMPARE(spyRelease.count(), 0);
|
||||
|
||||
QTest::mouseClick(&button, Qt::RightButton);
|
||||
QCOMPARE(spyPress.count(), 1);
|
||||
QCOMPARE(button.isDown(), true);
|
||||
QCOMPARE(spyRelease.count(), 0);
|
||||
|
||||
QPointF posOutOfWidget = QPointF(30, 30);
|
||||
QMouseEvent me(QEvent::MouseMove,
|
||||
posOutOfWidget, Qt::NoButton,
|
||||
Qt::MouseButtons(Qt::LeftButton),
|
||||
Qt::NoModifier); // mouse press and move
|
||||
|
||||
qApp->sendEvent(&button, &me);
|
||||
// should emit released signal once mouse is dragging out of boundary
|
||||
QCOMPARE(spyPress.count(), 1);
|
||||
QCOMPARE(button.isDown(), false);
|
||||
QCOMPARE(spyRelease.count(), 1);
|
||||
}
|
||||
|
||||
#ifdef QT_KEYPAD_NAVIGATION
|
||||
void tst_QAbstractButton::keyNavigation()
|
||||
{
|
||||
|
|
|
|||
Loading…
Reference in New Issue