QAbstractButton: emit released on focus out or disable

When pressing a button with the mouse and then moving the focus away,
the internal and visual state of the button would get updated, but the
released signal would not be emitted.
The same goes for disabling the button, although in 99% of the cases,
disabling the button will also move the focus, so the first case
already takes care of emitting the signal.

Task-number: QTBUG-42775
Change-Id: Ib6ba8e0a75f0349b66d1e799b02bd8498db85022
Reviewed-by: Gabriel de Dietrich <gabriel.dedietrich@theqtcompany.com>
This commit is contained in:
Frederik Gladhorn 2015-03-09 14:29:05 +01:00
parent 4c0c537421
commit 971b8413f2
2 changed files with 39 additions and 3 deletions

View File

@ -1293,8 +1293,10 @@ void QAbstractButton::focusInEvent(QFocusEvent *e)
void QAbstractButton::focusOutEvent(QFocusEvent *e)
{
Q_D(QAbstractButton);
if (e->reason() != Qt::PopupFocusReason)
if (e->reason() != Qt::PopupFocusReason && d->down) {
d->down = false;
d->emitReleased();
}
QWidget::focusOutEvent(e);
}
@ -1304,8 +1306,10 @@ void QAbstractButton::changeEvent(QEvent *e)
Q_D(QAbstractButton);
switch (e->type()) {
case QEvent::EnabledChange:
if (!isEnabled())
setDown(false);
if (!isEnabled() && d->down) {
d->down = false;
d->emitReleased();
}
break;
default:
d->sizeHint = QSize();

View File

@ -76,6 +76,7 @@ private slots:
void sizeHint_data();
void sizeHint();
void taskQTBUG_20191_shortcutWithKeypadModifer();
void emitReleasedAfterChange();
protected slots:
void resetCounters();
@ -663,5 +664,36 @@ void tst_QPushButton::taskQTBUG_20191_shortcutWithKeypadModifer()
QCOMPARE(spy2.count(), 1);
}
void tst_QPushButton::emitReleasedAfterChange()
{
QPushButton *button1 = new QPushButton("A");
QPushButton *button2 = new QPushButton("B");
QVBoxLayout *layout = new QVBoxLayout();
layout->addWidget(button1);
layout->addWidget(button2);
QDialog dialog;
dialog.setLayout(layout);
dialog.show();
QTest::qWaitForWindowExposed(&dialog);
QApplication::setActiveWindow(&dialog);
button1->setFocus();
QSignalSpy spy(button1, SIGNAL(released()));
QTest::mousePress(button1, Qt::LeftButton);
QVERIFY(button1->isDown());
QTest::keyClick(&dialog, Qt::Key_Tab);
QVERIFY(!button1->isDown());
QCOMPARE(spy.count(), 1);
spy.clear();
QCOMPARE(spy.count(), 0);
button1->setFocus();
QTest::mousePress(button1, Qt::LeftButton);
QVERIFY(button1->isDown());
button1->setEnabled(false);
QVERIFY(!button1->isDown());
QCOMPARE(spy.count(), 1);
}
QTEST_MAIN(tst_QPushButton)
#include "tst_qpushbutton.moc"