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 <tim.jenssen@theqtcompany.com>
This commit is contained in:
Thomas Hartmann
2016-06-21 18:01:26 +02:00
parent 8eeb657e75
commit 3fb0dc379a
2 changed files with 23 additions and 9 deletions

View File

@@ -221,7 +221,7 @@ FormEditorItem *FormEditorScene::addFormEditorItem(const QmlItemNode &qmlItemNod
void FormEditorScene::dropEvent(QGraphicsSceneDragDropEvent * event) void FormEditorScene::dropEvent(QGraphicsSceneDragDropEvent * event)
{ {
currentTool()->dropEvent(removeLayerItems(items(event->scenePos())), event); currentTool()->dropEvent(removeLayerItems(itemsAt(event->scenePos())), event);
if (views().first()) if (views().first())
views().first()->setFocus(); views().first()->setFocus();
@@ -229,19 +229,19 @@ void FormEditorScene::dropEvent(QGraphicsSceneDragDropEvent * event)
void FormEditorScene::dragEnterEvent(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) void FormEditorScene::dragLeaveEvent(QGraphicsSceneDragDropEvent * event)
{ {
currentTool()->dragLeaveEvent(removeLayerItems(items(event->scenePos())), event); currentTool()->dragLeaveEvent(removeLayerItems(itemsAt(event->scenePos())), event);
return; return;
} }
void FormEditorScene::dragMoveEvent(QGraphicsSceneDragDropEvent * event) void FormEditorScene::dragMoveEvent(QGraphicsSceneDragDropEvent * event)
{ {
currentTool()->dragMoveEvent(removeLayerItems(items(event->scenePos())), event); currentTool()->dragMoveEvent(removeLayerItems(itemsAt(event->scenePos())), event);
} }
QList<QGraphicsItem *> FormEditorScene::removeLayerItems(const QList<QGraphicsItem *> &itemList) QList<QGraphicsItem *> FormEditorScene::removeLayerItems(const QList<QGraphicsItem *> &itemList)
@@ -255,10 +255,23 @@ QList<QGraphicsItem *> FormEditorScene::removeLayerItems(const QList<QGraphicsIt
return itemListWithoutLayerItems; return itemListWithoutLayerItems;
} }
QList<QGraphicsItem *> 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) void FormEditorScene::mousePressEvent(QGraphicsSceneMouseEvent *event)
{ {
if (editorView() && editorView()->model()) if (editorView() && editorView()->model())
currentTool()->mousePressEvent(removeLayerItems(items(event->scenePos())), event); currentTool()->mousePressEvent(removeLayerItems(itemsAt(event->scenePos())), event);
} }
static QTime staticTimer() static QTime staticTimer()
@@ -275,9 +288,9 @@ void FormEditorScene::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
if (time.elapsed() > 30) { if (time.elapsed() > 30) {
time.restart(); time.restart();
if (event->buttons()) if (event->buttons())
currentTool()->mouseMoveEvent(removeLayerItems(items(event->scenePos())), event); currentTool()->mouseMoveEvent(removeLayerItems(itemsAt(event->scenePos())), event);
else else
currentTool()->hoverMoveEvent(removeLayerItems(items(event->scenePos())), event); currentTool()->hoverMoveEvent(removeLayerItems(itemsAt(event->scenePos())), event);
event->accept(); event->accept();
} }
@@ -286,7 +299,7 @@ void FormEditorScene::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
void FormEditorScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) void FormEditorScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
{ {
if (editorView() && editorView()->model()) { if (editorView() && editorView()->model()) {
currentTool()->mouseReleaseEvent(removeLayerItems(items(event->scenePos())), event); currentTool()->mouseReleaseEvent(removeLayerItems(itemsAt(event->scenePos())), event);
event->accept(); event->accept();
} }
@@ -295,7 +308,7 @@ void FormEditorScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
void FormEditorScene::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event) void FormEditorScene::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event)
{ {
if (editorView() && editorView()->model()) { if (editorView() && editorView()->model()) {
currentTool()->mouseDoubleClickEvent(removeLayerItems(items(event->scenePos())), event); currentTool()->mouseDoubleClickEvent(removeLayerItems(itemsAt(event->scenePos())), event);
event->accept(); event->accept();
} }

View File

@@ -111,6 +111,7 @@ protected:
private: private:
QList<QGraphicsItem *> removeLayerItems(const QList<QGraphicsItem *> &itemList); QList<QGraphicsItem *> removeLayerItems(const QList<QGraphicsItem *> &itemList);
QList<QGraphicsItem *> itemsAt(const QPointF &pos);
AbstractFormEditorTool* currentTool() const; AbstractFormEditorTool* currentTool() const;
void removeItemFromHash(FormEditorItem*); void removeItemFromHash(FormEditorItem*);