拖动的 QGraphicsItem 在 items() 函数中不可见
Dragged QGraphicsItem not visible in items() function
我创建了一个 QGraphicsScene
场景并向场景添加了一些图形项目(线条、矩形)等。
我可以使用这个列表遍历它们:
QList<QGraphicsItem*> all = items();
我为这些项目启用了移动,我可以通过单击选择它们来拖动它们。但是在拖动一个元素之后,它不再显示在 QGraphicsScene
的 items()
函数的调用中。
QList<QGraphicsItem*> all = items();
None 的拖动项目出现在上面的列表中,而非拖动的项目确实出现了。
拖动 QGraphicScene 元素会改变它们的父元素吗?或者有人可以针对此类问题提出建议的任何其他原因?
{P.S。代码太大无法分享}
编辑 1:
我正在使用标记 QGraphicsItem::ItemIsSelectable
和 QGraphicsItem::ItemIsMovable
来使项目可移动。
foreach(QGraphicsItem* itemInVisualScene, items())
{
itemInVisualScene->setFlag(QGraphicsItem::ItemIsSelectable, itemsMovable);
itemInVisualScene->setFlag(QGraphicsItem::ItemIsMovable, itemsMovable);
}
默认情况下,我在场景中添加了几个矩形。然后在 'move mode' 中我将它们拖来拖去。然后在 'add mode' 我点击屏幕添加新的矩形。我已经编写了一个逻辑来检查我是否正在单击任何现有的绘制矩形:
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);
}
对于未在 'move mode' 中拖动的矩形,添加矩形效果很好。但是被移动的矩形似乎不再识别点击。即使我单击之前拖动的现有矩形,我的控件也会跳出循环。
QGraphicsItem 的变换在拖动后发生变化,因此需要将点变换到项目的本地坐标。
gi->contains(gi->mapFromScene(dragBeginPoint))
要转换或获取项目在场景坐标中的位置,请使用
gi->mapToScene(0,0) or gi->scenePos()
我创建了一个 QGraphicsScene
场景并向场景添加了一些图形项目(线条、矩形)等。
我可以使用这个列表遍历它们:
QList<QGraphicsItem*> all = items();
我为这些项目启用了移动,我可以通过单击选择它们来拖动它们。但是在拖动一个元素之后,它不再显示在 QGraphicsScene
的 items()
函数的调用中。
QList<QGraphicsItem*> all = items();
None 的拖动项目出现在上面的列表中,而非拖动的项目确实出现了。
拖动 QGraphicScene 元素会改变它们的父元素吗?或者有人可以针对此类问题提出建议的任何其他原因?
{P.S。代码太大无法分享}
编辑 1:
我正在使用标记 QGraphicsItem::ItemIsSelectable
和 QGraphicsItem::ItemIsMovable
来使项目可移动。
foreach(QGraphicsItem* itemInVisualScene, items())
{
itemInVisualScene->setFlag(QGraphicsItem::ItemIsSelectable, itemsMovable);
itemInVisualScene->setFlag(QGraphicsItem::ItemIsMovable, itemsMovable);
}
默认情况下,我在场景中添加了几个矩形。然后在 'move mode' 中我将它们拖来拖去。然后在 'add mode' 我点击屏幕添加新的矩形。我已经编写了一个逻辑来检查我是否正在单击任何现有的绘制矩形:
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);
}
对于未在 'move mode' 中拖动的矩形,添加矩形效果很好。但是被移动的矩形似乎不再识别点击。即使我单击之前拖动的现有矩形,我的控件也会跳出循环。
QGraphicsItem 的变换在拖动后发生变化,因此需要将点变换到项目的本地坐标。
gi->contains(gi->mapFromScene(dragBeginPoint))
要转换或获取项目在场景坐标中的位置,请使用
gi->mapToScene(0,0) or gi->scenePos()