From ab97a44b6ae5cc826460f3704669383afd398594 Mon Sep 17 00:00:00 2001 From: Andrew den Exter Date: Mon, 3 Dec 2012 17:03:02 +1000 Subject: Clear focus of GraphicsItem focus scopes and their children. A focus scope has effective focus if one of its children is the focus item, clearFocus() should remove effective focus from an item and its children not just from the focus item. Task-number: QTBUG-28328 Change-Id: I62a292eff000151e50b2f5221e22f326a380fc3a Reviewed-by: Martin Jones --- .../qgraphicsitem/tst_qgraphicsitem.cpp | 39 ++++++++++++++++++++++ 1 file changed, 39 insertions(+) (limited to 'tests/auto/widgets/graphicsview/qgraphicsitem') diff --git a/tests/auto/widgets/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp b/tests/auto/widgets/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp index 9a996cd0c6..687d44808d 100644 --- a/tests/auto/widgets/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp +++ b/tests/auto/widgets/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp @@ -9228,6 +9228,45 @@ void tst_QGraphicsItem::focusScope() scope3->setFocus(); QVERIFY(scope3->hasFocus()); + // clearFocus() on a focus scope will remove focus from its children. + scope1->clearFocus(); + QVERIFY(!scope1->hasFocus()); + QVERIFY(!scope2->hasFocus()); + QVERIFY(!scope3->hasFocus()); + + scope1->setFocus(); + QVERIFY(!scope1->hasFocus()); + QVERIFY(!scope2->hasFocus()); + QVERIFY(scope3->hasFocus()); + + scope2->clearFocus(); + QVERIFY(scope1->hasFocus()); + QVERIFY(!scope2->hasFocus()); + QVERIFY(!scope3->hasFocus()); + + scope2->setFocus(); + QVERIFY(!scope1->hasFocus()); + QVERIFY(!scope2->hasFocus()); + QVERIFY(scope3->hasFocus()); + + // Focus cleared while a parent doesn't have focus remains cleared + // when the parent regains focus. + scope1->clearFocus(); + scope3->clearFocus(); + QVERIFY(!scope1->hasFocus()); + QVERIFY(!scope2->hasFocus()); + QVERIFY(!scope3->hasFocus()); + + scope1->setFocus(); + QVERIFY(!scope1->hasFocus()); + QVERIFY(scope2->hasFocus()); + QVERIFY(!scope3->hasFocus()); + + scope3->setFocus(); + QVERIFY(!scope1->hasFocus()); + QVERIFY(!scope2->hasFocus()); + QVERIFY(scope3->hasFocus()); + QGraphicsRectItem *rect4 = new QGraphicsRectItem; rect4->setData(0, "rect4"); rect4->setParentItem(scope3); -- cgit v1.2.3 From ed15e4eb07104dd780fe8d72b2792916ce4db098 Mon Sep 17 00:00:00 2001 From: Andreas Aardal Hanssen Date: Mon, 17 Dec 2012 10:10:35 +0100 Subject: Fix focusproxy-relayed crash in QGraphicsItem destructor. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Makes tst_qgraphicsitem::tst_focusProxyDeletion not crash. valgrind reported the error when running tst_qgraphicsitem. The crash was very real; when deleting an item that has another item as a focus proxy, the proxy still had a reference to the deleted item's focusProxy pointer. I'm not a huge fan of whitebox testing but thought this crash justifies a modification of the test to make it fail, instead of just passing silently with a warning only given by valgrind and friends. FTR the reason the test doesn't crash hard is that the memory is freed but not reused within the scope of the test. So the access to the pointer d_ptr->focusProxy succeeds, it just accesses memory that might as well have been reclaimed. But this is quite undefined... Task-number: QTBUG-28321 Change-Id: I2624631f5e5c2a8aa8bd4efe1fc128eba6c61f56 Reviewed-by: Jan Arve Sæther --- tests/auto/widgets/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp | 2 ++ 1 file changed, 2 insertions(+) (limited to 'tests/auto/widgets/graphicsview/qgraphicsitem') diff --git a/tests/auto/widgets/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp b/tests/auto/widgets/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp index 687d44808d..2d379d3c07 100644 --- a/tests/auto/widgets/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp +++ b/tests/auto/widgets/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp @@ -8485,7 +8485,9 @@ void tst_QGraphicsItem::focusProxyDeletion() rect2 = new QGraphicsRectItem; rect->setFocusProxy(rect2); + QGraphicsItem **danglingFocusProxyRef = &rect->d_ptr->focusProxy; delete rect; // don't crash + QVERIFY(!rect2->d_ptr->focusProxyRefs.contains(danglingFocusProxyRef)); rect = new QGraphicsRectItem; rect->setFocusProxy(rect2); -- cgit v1.2.3