拖动的 QGraphicsItem 在 items() 函数中不可见

Posted

技术标签:

【中文标题】拖动的 QGraphicsItem 在 items() 函数中不可见【英文标题】:Dragged QGraphicsItem not visible in items() function 【发布时间】:2015-07-06 10:47:57 【问题描述】:

我创建了一个QGraphicsScene 场景并向场景中添加了一些图形项目(线条、矩形)等。

我可以使用这个列表遍历它们:

 QList<QGraphicsItem*> all = items();

我为这些项目启用了移动,我可以通过单击选择它们来拖动它们。但是在一个元素被拖动之后,它就不再出现在对QGraphicsSceneitems() 函数的调用中。

QList<QGraphicsItem*> all = items();

以上列表中没有显示拖动的项目,而未拖动的项目会显示。

拖动 QGraphicScene 元素会改变它们的父元素吗?或任何其他原因有人可能会针对此类问题提出建议?

附注代码太大,无法分享


编辑 1:

我正在使用标志 QGraphicsItem::ItemIsSelectableQGraphicsItem::ItemIsMovable 使项目可移动。

foreach(QGraphicsItem* itemInVisualScene, items())

        itemInVisualScene->setFlag(QGraphicsItem::ItemIsSelectable, itemsMovable);
        itemInVisualScene->setFlag(QGraphicsItem::ItemIsMovable, itemsMovable);

默认情况下,我会在场景中添加几个矩形。然后在“移动模式”中拖动它们。然后在“添加模式”中单击屏幕以添加新矩形。我已经编写了一个逻辑来检查我是否点击了任何现有的绘制矩形:

void Scene::mousePressEvent(QGraphicsSceneMouseEvent * event)

if(eDrawLines == sceneMode)

        dragBeginPoint = event->scenePos();
        dragEndPoint = dragBeginPoint;
        QList<QGraphicsItem*> all = items();

        for (int i = 0; i < all.size(); i++)
        
            QGraphicsItem *gi = all[i];

            // Clicked point lies inside existing rect
            if( QGraphicsRectItem::Type == gi->type() && gi->contains(dragBeginPoint))
            
                std::cout << "Pressed inside existing rect" << std::endl;
                return;
            
        
        std::cout << "Point not found, add new rectangle" << std::endl;            


QGraphicsScene::mousePressEvent(event);

这种矩形的添加适用于未在“移动模式”中拖动的矩形。但是被移动的矩形似乎不再识别点击。即使我单击之前拖动的现有矩形,我的控件也会退出循环。

【问题讨论】:

拖拽是如何实现的?你使用ItemIsMovable 还是什么?拖动后items() 的总数会减少吗? @PavelStrakhov 更新了帖子。 【参考方案1】:

QGraphicsItem的transform在拖动后发生变化,因此需要将点转换为item的本地坐标。

gi->contains(gi->mapFromScene(dragBeginPoint))

要转换或获取项目在场景坐标中的位置,请使用

gi->mapToScene(0,0) or gi->scenePos()

【讨论】:

行得通!谢谢..你能告诉我现在如何协调这个rect吗?使用dynamic_cast&lt;QGraphicsRectItem*&gt;(gi)-&gt;rect().x() 给出拖动前的坐标。

以上是关于拖动的 QGraphicsItem 在 items() 函数中不可见的主要内容,如果未能解决你的问题,请参考以下文章

Qt 视图框架QGraphicsItem

QGraphicsItem删除item崩溃

QGraphicsItem删除item崩溃

QGraphicsItem删除item崩溃

Qt 获取QGraphicsItem在屏幕上的位置,在QGraphicsItem中获取全局位置,转换为screenPos

如何识别QGraphicsItem和QGraphicsTextItem-CSDN论坛