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



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

我可以使用以下列表循环浏览它们:

 QList<QGraphicsItem*> all = items();

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

QList<QGraphicsItem*> all = items();

拖动的项目都不会显示在上面的列表中,而未拖动的项目确实会显示。

拖动QGraphicScene元素是否会更改其父元素?或者有人能为这样的问题提出任何其他原因?

{p.S.代码太大,无法共享}


编辑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);
}

对于未在"移动模式"中拖动的矩形,添加矩形效果良好。但是被移动的矩形似乎再也认不出点击了。即使我单击先前拖动的现有矩形,我的控件也会脱离循环。

QGraphicsItem的变换在拖动后发生更改,因此需要将点变换为项的局部坐标。

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

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

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

相关内容

  • 没有找到相关文章

最新更新