QGraphicsPolygonItem出现问题,移动后用鼠标拖动它们的角



我一直在使用QGraphicsPolygonItem开发QT应用程序。首先,我创建了一个名为DiagramScene的类,它继承了QGraphicsScene。首先,我创建项目,并在多边形的每个点上放上红色的角:

item = new DiagramItem(myItemType, myItemMenu);
item->setBrush(myItemColor);
addItem(item);
item->setPen(QPen(myLineColor, 2));
item->setPolygon(mouseEvent->scenePos());
item->setSelected(true);
emit itemInserted(item);
this->putPointsOnItem(item);

putPointsOnItem函数:

void DiagramScene::putPointsOnItem(DiagramItem *item) {
qDebug() << "putPointsOnItem";
removeControlPoints();
QPolygonF p = item->polygon();
poly_points.clear();
poly_points = p;
qDebug() << p;
for (int i = 0; i < p.size(); i++) {
QPointF point = item->mapToScene(p[i]);
QGraphicsEllipseItem *ellipse = addEllipse(QRectF(point.x() -5, point.y() -5, 8, 8), QPen(Qt::red, 3), QBrush(QColor("red")));
ellipse->setFlag(QGraphicsItem::ItemIsMovable);
ellipse->setZValue(100000000);
corner_points.append(ellipse);
real_corners.append(item);
}
}

然后我检查拐角是否被选中:

void DiagramScene::mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent) {
if (mouseEvent->button() != Qt::LeftButton) {
return;
}
this->finded = false;
for (int i = 0; i < this->corner_points.length(); i++) {
QGraphicsEllipseItem *item = this->corner_points[i];
qDebug() << item;
if (item->contains(mouseEvent->scenePos())) {
item->setSelected(true);
const QList<QGraphicsItem *> items = selectedItems();
if (items.length()>0) {
DiagramItem *startItem = qgraphicsitem_cast<DiagramItem *>(items.first());
startItem->setFlag(QGraphicsItem::ItemIsMovable, false);
selectedItem = startItem;
}
this->selected_corner = item;
this->selected_corner_point = this->poly_points[i];
selected_corner_number = i;
finded = true;
break;
}
}
if (this->finded == true) {
QGraphicsScene::mousePressEvent(mouseEvent);
qDebug() << "POLY POINTS FINDED:";
qDebug() << poly_points;
return;
}

当用户移动鼠标时,我检查所选的角落,并将鼠标位置放在其中一个点上:

void DiagramScene::mouseMoveEvent(QGraphicsSceneMouseEvent *mouseEvent) {

QGraphicsScene::mouseMoveEvent(mouseEvent);
QString coord = QString("%1, %2").arg(mouseEvent->scenePos().x()).arg(mouseEvent->scenePos().y());
parentMain->setCoordinates(coord);
if ((mouseEvent->buttons() & Qt::LeftButton)) {
const QList<QGraphicsItem *> items = selectedItems();

if (finded == true) {

finded = false;
for (int i = 0; i < corner_points.size(); ++i) {
if (corner_points.at(i) == selected_corner) {
poly_points[selected_corner_number] = mouseEvent->scenePos();
finded = true;
break;
}
}
if (finded) {
qDebug() << poly_points;
selectedItem->setPolygonItem(poly_points);
return;
}

在那之前,一切都很好,但当用户移动项目时,位置并没有像我预期的那样工作。现在我已经疯了好几天了,需要帮助。非常感谢!

我认为问题就在这里:

poly_points[selected_corner_number] = mouseEvent->scenePos();

问题图像描述

您的评论为我指明了正确的方向,我找到了解决方案:

poly_points[selected_corner_number] = selectedItem->mapFromScene(mouseEvent->scenePos());

非常感谢!

最新更新