在Qt的QGraphicsView框架中,滑鼠點擊視圖獲取座標,經mapToScene()轉換為場景座標後繪製QGraphicsItem,發現繪製位置與點擊位置有明顯偏移。
QPoint viewPos = event->pos(); // 獲取視口座標
QPointF scenePos = view_1->mapToScene(viewPos); // 轉場景座標
select->setRect(scenePos.x(), scenePos.y(), 50, 50); // 繪製矩形
經排查,問題出在多層Layout佈局的邊距上。Qt預設Layout邊距為11像素,導致視口座標系與實際顯示區域不對齊。
setContentsMargins(0,0,0,0)// 在構造函數中設置
ui->graphicsView->setContentsMargins(0,0,0,0);
ui->graphicsView->layout()->setContentsMargins(0,0,0,0);
mapToScene前確認視口幾何屬性viewport()->rect()驗證實際可視區域這個問題看似複雜,實則是佈局細節導致,記住「座標轉換前先檢查佈局邊距」即可避坑。