From c72c22871774261ad980eb5a7e0c786ee44a5a4d Mon Sep 17 00:00:00 2001 From: Volker Hilsheimer Date: Thu, 25 Feb 2021 16:58:27 +0100 Subject: [PATCH] Add nullptr checks to QGraphicsView classes The styleInfo parameter defaults to nullptr, and the scene can evidently be nullptr since we test for it before ungrabbing the mouse. Fixes static analyzer warnings fbd03604cc701651595a2ea33c5562b4 and 30fcb05194f3a2d121fc57b05e0ccf10 Change-Id: I8e9d4fe4055115c366ada1cbb22a8f0839ba41da Reviewed-by: David Skoland Reviewed-by: Richard Moe Gustavsen (cherry picked from commit 98db99657649d4668c766eaa36b8d29c58d19754) Reviewed-by: Qt Cherry-pick Bot --- .../graphicsview/qgraphicsanchorlayout_p.cpp | 4 +- src/widgets/graphicsview/qgraphicsitem.cpp | 38 ++++++++++--------- 2 files changed, 23 insertions(+), 19 deletions(-) diff --git a/src/widgets/graphicsview/qgraphicsanchorlayout_p.cpp b/src/widgets/graphicsview/qgraphicsanchorlayout_p.cpp index be26b2785e3..9da290974b5 100644 --- a/src/widgets/graphicsview/qgraphicsanchorlayout_p.cpp +++ b/src/widgets/graphicsview/qgraphicsanchorlayout_p.cpp @@ -225,7 +225,7 @@ void AnchorData::refreshSizeHints(const QLayoutStyleInfo *styleInfo) if (anchorPrivate->hasSize) { // Anchor has user-defined size prefSizeHint = anchorPrivate->preferredSize; - } else { + } else if (styleInfo) { // Fetch size information from style const Qt::Orientation orient = QGraphicsAnchorLayoutPrivate::edgeOrientation(from->m_edge); qreal s = styleInfo->defaultSpacing(orient); @@ -241,6 +241,8 @@ void AnchorData::refreshSizeHints(const QLayoutStyleInfo *styleInfo) s = 0; } prefSizeHint = s; + } else { + prefSizeHint = 0; } } diff --git a/src/widgets/graphicsview/qgraphicsitem.cpp b/src/widgets/graphicsview/qgraphicsitem.cpp index e426e09adf7..bad40b0cffd 100644 --- a/src/widgets/graphicsview/qgraphicsitem.cpp +++ b/src/widgets/graphicsview/qgraphicsitem.cpp @@ -2652,23 +2652,25 @@ void QGraphicsItemPrivate::setEnabledHelper(bool newEnabled, bool explicitly, bo // Certain properties are dropped when an item is disabled. if (!newEnabled) { - if (scene && scene->mouseGrabberItem() == q_ptr) - q_ptr->ungrabMouse(); - if (q_ptr->hasFocus()) { - // Disabling the closest non-panel ancestor of the focus item - // causes focus to pop to the next item, otherwise it's cleared. - QGraphicsItem *focusItem = scene->focusItem(); - bool clear = true; - if (isWidget && !focusItem->isPanel() && q_ptr->isAncestorOf(focusItem)) { - do { - if (focusItem == q_ptr) { - clear = !static_cast(q_ptr)->focusNextPrevChild(true); - break; - } - } while ((focusItem = focusItem->parentWidget()) && !focusItem->isPanel()); + if (scene) { + if (scene->mouseGrabberItem() == q_ptr) + q_ptr->ungrabMouse(); + if (q_ptr->hasFocus()) { + // Disabling the closest non-panel ancestor of the focus item + // causes focus to pop to the next item, otherwise it's cleared. + QGraphicsItem *focusItem = scene->focusItem(); + bool clear = true; + if (isWidget && !focusItem->isPanel() && q_ptr->isAncestorOf(focusItem)) { + do { + if (focusItem == q_ptr) { + clear = !static_cast(q_ptr)->focusNextPrevChild(true); + break; + } + } while ((focusItem = focusItem->parentWidget()) && !focusItem->isPanel()); + } + if (clear) + q_ptr->clearFocus(); } - if (clear) - q_ptr->clearFocus(); } if (q_ptr->isSelected()) q_ptr->setSelected(false); @@ -7149,14 +7151,14 @@ void QGraphicsItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event) if ((item->flags() & ItemIsMovable) && !QGraphicsItemPrivate::movableAncestorIsSelected(item)) { QPointF currentParentPos; QPointF buttonDownParentPos; - if (item->d_ptr->ancestorFlags & QGraphicsItemPrivate::AncestorIgnoresTransformations) { + if (view && (item->d_ptr->ancestorFlags & QGraphicsItemPrivate::AncestorIgnoresTransformations)) { // Items whose ancestors ignore transformations need to // map screen coordinates to local coordinates, then map // those to the parent. QTransform viewToItemTransform = (item->deviceTransform(view->viewportTransform())).inverted(); currentParentPos = mapToParent(viewToItemTransform.map(QPointF(view->mapFromGlobal(event->screenPos())))); buttonDownParentPos = mapToParent(viewToItemTransform.map(QPointF(view->mapFromGlobal(event->buttonDownScreenPos(Qt::LeftButton))))); - } else if (item->flags() & ItemIgnoresTransformations) { + } else if (view && (item->flags() & ItemIgnoresTransformations)) { // Root items that ignore transformations need to // calculate their diff by mapping viewport coordinates // directly to parent coordinates.