gpt4 book ai didi

c++ - 设置位置后,Qt 使用 contains() 删除对象

转载 作者:搜寻专家 更新时间:2023-10-31 02:11:22 25 4
gpt4 key购买 nike

我有一个场景,在场景中我有椭圆(圆圈),我用 setPos() 改变了位置,所以当我稍后询问它的位置时,我不会得到 0,0坐标,但现在当我想删除对象时,成员函数 contains() 的计算结果永远不会为真,这是可以理解的。问题是,我怎样才能到达场景坐标或对象坐标,所以当我单击对象时,我得到了 contains() 成员函数的真实评估。我已经尝试了 mapToScene()mapFromScene() 没有帮助。 (仍然有点迷失在 Qt 坐标系中)

代码示例:

void MyQGraphicsView::mousePressEvent(QMouseEvent * e)
{
QPointF pt = mapToScene(e->pos());
if(e->button()==Qt::RightButton)
{
// remove point
QList<QGraphicsItem *> listIt = scene->items();
QList<QGraphicsItem *>::const_iterator stlIter;
QGraphicsItem * itemToRemove = NULL;
QGraphicsEllipseItem it; // for type checking
for(stlIter = listIt.begin(); stlIter != listIt.end(); ++stlIter)
{
// if it has the expected type and the point is inside (type checking is redundant)
if(((*stlIter)->type() == it.type()) && ((*stlIter)->contains(pt))){
// contains(pt) is never true - understandably
itemToRemove = *stlIter;
break;
}
}
if(itemToRemove != NULL) scene->removeItem(itemToRemove);
}else{ // leftClick to add ellipse
double rad = 10;
QGraphicsEllipseItem* pEllipse = scene->addEllipse(-rad, -rad, rad*2.0, rad*2.0, QPen(Qt::red,0), QBrush(Qt::red,Qt::SolidPattern));
pEllipse->setPos(pt.x(), pt.y()); // set the postion so it does not return 0,0
}
}

最佳答案

QGraphicsItem::contains方法采用局部坐标中的点,即坐标为 (0, 0) 的点作为QGraphicsItem的中心.

您正在使用全局场景坐标中的点。获取给定 QGprahicsItem 的局部坐标中的一个点你可以使用 QGraphicsItem::mapFromScene(const QPointF & point)方法。

你可能想做这样的事情:

for(Object& obj : objects)
if(obj.contains(obj.mapFromScene(point)))
// do stuf because point is inside obj

来源:

关于c++ - 设置位置后,Qt 使用 contains() 删除对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43717328/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com