目錄
1. 獲取圖元在場景中的位置
對于 QGraphicsEllipseItem(點圖元)
3. 響應點擊事件獲取坐標
4. 獲取選中點的坐標
5. 坐標轉換說明
注意事項
在 Qt 圖形視圖框架中,從 QGraphicsItem(特別是點圖元)獲取坐標有多種方式,取決于你需要的是場景坐標、視圖坐標還是圖元自身的局部坐標。
1. 獲取圖元在場景中的位置
對于 QGraphicsEllipseItem(點圖元)
// 假設 item 是你的 QGraphicsEllipseItem 指針
if (QGraphicsEllipseItem* pointItem = qgraphicsitem_cast<QGraphicsEllipseItem*>(item)) {// 獲取圖元中心點在場景中的坐標QPointF scenePos = pointItem->scenePos();// 或者獲取包圍矩形的中心QRectF rect = pointItem->rect();QPointF centerInItem = rect.center();QPointF centerInScene = pointItem->mapToScene(centerInItem);qDebug() << "場景坐標:" << scenePos;qDebug() << "精確中心坐標:" << centerInScene;
}
2. 從 QMap<int, QGraphicsEllipseItem*> 獲取所有點坐標
QMap<int, QGraphicsEllipseItem*> pointMap; // 你的點圖元容器// 遍歷獲取所有點坐標
for (auto it = pointMap.constBegin(); it != pointMap.constEnd(); ++it) {int id = it.key();QGraphicsEllipseItem* item = it.value();QPointF scenePos = item->scenePos();QRectF rect = item->rect();QPointF center = item->mapToScene(rect.center());qDebug() << "點ID:" << id << "場景坐標:" << center;// 如果需要視圖坐標(像素坐標)QPoint viewPos = mGraphicsView->mapFromScene(center);qDebug() << "視圖坐標:" << viewPos;
}
3. 響應點擊事件獲取坐標
// 在場景子類中重寫鼠標事件
void MyGraphicsScene::mousePressEvent(QGraphicsSceneMouseEvent* event) {QGraphicsScene::mousePressEvent(event); // 先讓基類處理選擇邏輯// 獲取點擊位置的圖元QGraphicsItem* item = itemAt(event->scenePos(), QTransform());if (item && (item->type() == QGraphicsEllipseItem::Type)) {QGraphicsEllipseItem* ellipse = static_cast<QGraphicsEllipseItem*>(item);QPointF center = ellipse->mapToScene(ellipse->rect().center());qDebug() << "點擊了點圖元,中心坐標:" << center;}
}
4. 獲取選中點的坐標
// 獲取當前選中的所有點圖元坐標
QList<QPointF> getSelectedPointsCoordinates() {QList<QPointF> coordinates;foreach (QGraphicsItem* item, mScene->selectedItems()) {if (item->type() == QGraphicsEllipseItem::Type) {QGraphicsEllipseItem* ellipse = static_cast<QGraphicsEllipseItem*>(item);coordinates.append(ellipse->mapToScene(ellipse->rect().center()));}}return coordinates;
}
5. 坐標轉換說明
Qt 圖形視圖框架有三級坐標系:
-
圖元局部坐標:相對于圖元自身的坐標系
-
場景坐標:所有圖元共用的全局坐標系
-
視圖坐標:窗口部件的像素坐標系
常用轉換方法:
// 局部坐標 → 場景坐標
QPointF scenePos = item->mapToScene(localPos);// 場景坐標 → 視圖坐標
QPoint viewPos = graphicsView->mapFromScene(scenePos);// 視圖坐標 → 場景坐標
QPointF scenePos = graphicsView->mapToScene(viewPos);
注意事項
-
如果圖元有旋轉或縮放,直接使用?
scenePos()
?可能不準確,建議使用?mapToScene(rect.center())
-
確保在獲取坐標前圖元已被添加到場景中
-
對于非常精確的坐標需求,考慮設置圖元的?
CacheMode
?為?DeviceCoordinateCache