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)
{
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<QGraphicsItem *> FormEditorScene::removeLayerItems(const QList<QGraphicsItem *> &itemList)
@@ -255,10 +255,23 @@ QList<QGraphicsItem *> FormEditorScene::removeLayerItems(const QList<QGraphicsIt
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)
{
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();
}

View File

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