From 3fb0dc379a005ee8b046d295adb6457e591cc7d1 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Tue, 21 Jun 2016 18:01:26 +0200 Subject: [PATCH] QmlDesigner: Use correct overload of QGraphicsScene:items QGraphicsScene:items() is deprecated and returns incorrect results if the scene contains items that ignore transformations. We have to use the overload that takes a QTransform instead and define itemsAt for convenience. Task-number: QTBUG-49627 Change-Id: I388c62dd23a61c569ec6b99d756f4fbe1024e5db Reviewed-by: Tim Jenssen --- .../components/formeditor/formeditorscene.cpp | 31 +++++++++++++------ .../components/formeditor/formeditorscene.h | 1 + 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorscene.cpp b/src/plugins/qmldesigner/components/formeditor/formeditorscene.cpp index 0f958a0f968..7a4ad4f9cb1 100644 --- a/src/plugins/qmldesigner/components/formeditor/formeditorscene.cpp +++ b/src/plugins/qmldesigner/components/formeditor/formeditorscene.cpp @@ -221,7 +221,7 @@ FormEditorItem *FormEditorScene::addFormEditorItem(const QmlItemNode &qmlItemNod void FormEditorScene::dropEvent(QGraphicsSceneDragDropEvent * event) { - currentTool()->dropEvent(removeLayerItems(items(event->scenePos())), event); + currentTool()->dropEvent(removeLayerItems(itemsAt(event->scenePos())), event); if (views().first()) views().first()->setFocus(); @@ -229,19 +229,19 @@ void FormEditorScene::dropEvent(QGraphicsSceneDragDropEvent * event) void FormEditorScene::dragEnterEvent(QGraphicsSceneDragDropEvent * event) { - currentTool()->dragEnterEvent(removeLayerItems(items(event->scenePos())), event); + currentTool()->dragEnterEvent(removeLayerItems(itemsAt(event->scenePos())), event); } void FormEditorScene::dragLeaveEvent(QGraphicsSceneDragDropEvent * event) { - currentTool()->dragLeaveEvent(removeLayerItems(items(event->scenePos())), event); + currentTool()->dragLeaveEvent(removeLayerItems(itemsAt(event->scenePos())), event); return; } void FormEditorScene::dragMoveEvent(QGraphicsSceneDragDropEvent * event) { - currentTool()->dragMoveEvent(removeLayerItems(items(event->scenePos())), event); + currentTool()->dragMoveEvent(removeLayerItems(itemsAt(event->scenePos())), event); } QList FormEditorScene::removeLayerItems(const QList &itemList) @@ -255,10 +255,23 @@ QList FormEditorScene::removeLayerItems(const QList FormEditorScene::itemsAt(const QPointF &pos) +{ + QTransform transform; + + if (!views().isEmpty()) + transform = views().first()->transform(); + + return items(pos, + Qt::IntersectsItemShape, + Qt::DescendingOrder, + transform); +} + void FormEditorScene::mousePressEvent(QGraphicsSceneMouseEvent *event) { if (editorView() && editorView()->model()) - currentTool()->mousePressEvent(removeLayerItems(items(event->scenePos())), event); + currentTool()->mousePressEvent(removeLayerItems(itemsAt(event->scenePos())), event); } static QTime staticTimer() @@ -275,9 +288,9 @@ void FormEditorScene::mouseMoveEvent(QGraphicsSceneMouseEvent *event) if (time.elapsed() > 30) { time.restart(); if (event->buttons()) - currentTool()->mouseMoveEvent(removeLayerItems(items(event->scenePos())), event); + currentTool()->mouseMoveEvent(removeLayerItems(itemsAt(event->scenePos())), event); else - currentTool()->hoverMoveEvent(removeLayerItems(items(event->scenePos())), event); + currentTool()->hoverMoveEvent(removeLayerItems(itemsAt(event->scenePos())), event); event->accept(); } @@ -286,7 +299,7 @@ void FormEditorScene::mouseMoveEvent(QGraphicsSceneMouseEvent *event) void FormEditorScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) { if (editorView() && editorView()->model()) { - currentTool()->mouseReleaseEvent(removeLayerItems(items(event->scenePos())), event); + currentTool()->mouseReleaseEvent(removeLayerItems(itemsAt(event->scenePos())), event); event->accept(); } @@ -295,7 +308,7 @@ void FormEditorScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) void FormEditorScene::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event) { if (editorView() && editorView()->model()) { - currentTool()->mouseDoubleClickEvent(removeLayerItems(items(event->scenePos())), event); + currentTool()->mouseDoubleClickEvent(removeLayerItems(itemsAt(event->scenePos())), event); event->accept(); } diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorscene.h b/src/plugins/qmldesigner/components/formeditor/formeditorscene.h index a16b45dab28..ee8340ec149 100644 --- a/src/plugins/qmldesigner/components/formeditor/formeditorscene.h +++ b/src/plugins/qmldesigner/components/formeditor/formeditorscene.h @@ -111,6 +111,7 @@ protected: private: QList removeLayerItems(const QList &itemList); + QList itemsAt(const QPointF &pos); AbstractFormEditorTool* currentTool() const; void removeItemFromHash(FormEditorItem*);