summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFrederik Gladhorn <frederik.gladhorn@theqtcompany.com>2015-03-09 14:29:05 +0100
committerFrederik Gladhorn <frederik.gladhorn@theqtcompany.com>2015-03-10 11:35:32 +0000
commit971b8413f27f6e317e9e37f518fcc1e6b9eed978 (patch)
tree2eff2a52644f0099d36c2978bb173bb5e524172f
parent4c0c53742140ef6f35a5258e79f62a202fe9832e (diff)
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>
-rw-r--r--src/widgets/widgets/qabstractbutton.cpp10
-rw-r--r--tests/auto/widgets/widgets/qpushbutton/tst_qpushbutton.cpp32
2 files changed, 39 insertions, 3 deletions
diff --git a/src/widgets/widgets/qabstractbutton.cpp b/src/widgets/widgets/qabstractbutton.cpp
index 965278265a..e413b3b87a 100644
--- a/src/widgets/widgets/qabstractbutton.cpp
+++ b/src/widgets/widgets/qabstractbutton.cpp
@@ -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();
diff --git a/tests/auto/widgets/widgets/qpushbutton/tst_qpushbutton.cpp b/tests/auto/widgets/widgets/qpushbutton/tst_qpushbutton.cpp
index c53a7cc5ca..4fd8b99acf 100644
--- a/tests/auto/widgets/widgets/qpushbutton/tst_qpushbutton.cpp
+++ b/tests/auto/widgets/widgets/qpushbutton/tst_qpushbutton.cpp
@@ -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"