diff options
author | J-P Nurmi <jpnurmi@digia.com> | 2014-02-05 11:48:51 +0100 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2014-02-12 01:41:15 +0100 |
commit | 4d6cb199b828256cb78ff986f2c1a508b339d2ee (patch) | |
tree | f1b19644a7b81b33d2ee61be02b8db0cfecb9b92 | |
parent | be51772d023161c81978b3a63b6379d4ebb8013f (diff) |
Make QToolButtonPrivate::popupTimerDone() more robust
Avoid dereferencing the q-pointer if the button has been
destructed meanwhile popup was open.
Task-number: QTBUG-26956
Change-Id: I68190e9fe84c669229ae0ce4d573ee7a02a8a141
Reviewed-by: Ivan Komissarov <ABBAPOH@gmail.com>
Reviewed-by: Thorbjørn Lund Martsum <tmartsum@gmail.com>
-rw-r--r-- | src/widgets/widgets/qtoolbutton.cpp | 7 | ||||
-rw-r--r-- | tests/auto/widgets/widgets/qtoolbutton/tst_qtoolbutton.cpp | 10 |
2 files changed, 14 insertions, 3 deletions
diff --git a/src/widgets/widgets/qtoolbutton.cpp b/src/widgets/widgets/qtoolbutton.cpp index f08689cb9b..497bc52109 100644 --- a/src/widgets/widgets/qtoolbutton.cpp +++ b/src/widgets/widgets/qtoolbutton.cpp @@ -778,15 +778,16 @@ void QToolButtonPrivate::popupTimerDone() actualMenu->d_func()->causedPopup.action = defaultAction; actionsCopy = q->actions(); //(the list of action may be modified in slots) actualMenu->exec(p); + + if (!that) + return; + QObject::disconnect(actualMenu, SIGNAL(aboutToHide()), q, SLOT(_q_updateButtonDown())); if (mustDeleteActualMenu) delete actualMenu; else QObject::disconnect(actualMenu, SIGNAL(triggered(QAction*)), q, SLOT(_q_menuTriggered(QAction*))); - if (!that) - return; - actionsCopy.clear(); if (repeat) diff --git a/tests/auto/widgets/widgets/qtoolbutton/tst_qtoolbutton.cpp b/tests/auto/widgets/widgets/qtoolbutton/tst_qtoolbutton.cpp index cebd4883a4..aaff322c4b 100644 --- a/tests/auto/widgets/widgets/qtoolbutton/tst_qtoolbutton.cpp +++ b/tests/auto/widgets/widgets/qtoolbutton/tst_qtoolbutton.cpp @@ -63,6 +63,7 @@ private slots: void collapseTextOnPriority(); void task230994_iconSize(); void task176137_autoRepeatOfAction(); + void qtbug_26956_popupTimerDone(); protected slots: void sendMouseClick(); @@ -223,5 +224,14 @@ void tst_QToolButton::sendMouseClick() QTest::mouseClick(w, Qt::LeftButton, 0, QPoint(7,7)); } +void tst_QToolButton::qtbug_26956_popupTimerDone() +{ + QToolButton *tb = new QToolButton; + tb->setMenu(new QMenu(tb)); + tb->menu()->addAction("Qt"); + tb->deleteLater(); + tb->showMenu(); +} + QTEST_MAIN(tst_QToolButton) #include "tst_qtoolbutton.moc" |