2016-12-13 4 views
0

모양이 현재 어디에 있는지를 알 수있는 온라인 모니터링 시스템을 원했지만 항목의 매우 이상한 좌표를 얻었습니다. 새 항목을 만들고 끌 때마다 항목의 크기가 1 씩 높아졌습니다.드래그 해제 후 QGraphicsRectItem의 위치를 ​​올바르게 얻는 방법은 무엇입니까?

초기 위치 (지도의 크기는 노란색 공간에 바인딩 qDebug(), 현장에 출력에 의해 확인, 751에 의해 751입니다) :

Initial position

왼쪽 상단 모서리에 드래그.

enter image description here

당신이에 있던 시작에서 볼 수 있듯이 (200, 200), 그러나 드래그 후가 (-201, -196)에 있습니다. 삭제하고 동일한 속성으로 같은 위치에 새 모양을 만든 후에는지도 외부에 있기 때문에 새 모양을 볼 수 없으므로 수정 사항이 올바른 데이터를 나타내지 못합니다.

다음
void MainWindow::updateEdits(QAbstractGraphicsShapeItem* item) 
{ 
    //stuff not related to scene 

    auto posReal = item->scenePos(); 
    auto pos = posReal.toPoint(); 

    //create QString from coordinates 
    QString coordinate; 
    coordinate.setNum(pos.x()); 
    ui->leftXEdit->setText(coordinate); 
    coordinate.setNum(pos.y()); 
    ui->upperYEdit->setText(coordinate); 

    //get width and height for rect, radius for circle  
    auto boundingRectReal = item->sceneBoundingRect(); 
    auto boundingRect = boundingRectReal.toRect(); 
    ui->widthEdit->setText(QString::number(boundingRect.width())); 
    //disables height edit for circles, not really relevant 
    if (!items[currentShapeIndex].isRect) 
    { 
     ui->heightEdit->setDisabled(true); 
    } 
    else 
    { 
     ui->heightEdit->setDisabled(false); 
     ui->heightEdit->setText(QString::number(boundingRect.height())); 
    } 
} 

내가 왼쪽 상단 모서리에 QGraphicsScene을 고정하는 방법입니다

여기
void CallableGraphicsRectItem::mouseReleaseEvent(QGraphicsSceneMouseEvent* event) 
{ 
    QGraphicsRectItem::mouseReleaseEvent(event); 
    ptr->updateEdits(this); 
} 

내가 updateEdits()으로 줄이기 위해 관리하는 것입니다 : 여기

는 업데이트 편집의 코드 노란색 영역 :

scene->setSceneRect(0, 0, mapSize.width() - 20, mapSize.height() - 20); 
ui->graphicsView->setScene(scene); 

데이터를 수정 사항에 적용 하시겠습니까?

답변

1

itemChange 메서드를 재정의하고 ItemPositionHasChanged 알림을 사용하는 것이 좋습니다. 항목에 ItemSendGeometryChanges 플래그를 설정하여 이러한 알림을 받도록해야합니다.

아직 mouseReleaseEvent 메소드에있을 때 항목의 최종 위치가 설정되어 있는지 확실하지 않습니다. itemChange에서 데이터를 추적하면 데이터가 유효한지 확인할 수 있습니다.

또한 "pos"는 항목의 부모 좌표에 있고 "boundingRect"는 항목의 좌표 공간에 있습니다. 장면 좌표를 사용하려면 "scenePos"와 "sceneBoundingRect"를 사용해야합니다. 항목에 부모가 없으면 "pos"와 "scenePos"는 같은 값을 반환하지만 "boundingRect"와 "sceneBoundingRect"는 일반적으로 다릅니다.

+0

"boundingRect"와 "sceneBoundingRect"는 항목의 변형 행렬이 적용된 경우가 아니면 왼쪽 위 값과 왼쪽 위 값이 다르지만 일반적으로 너비와 높이가 다르지 않습니다. – goug

+0

'ItemSendsScenePositionChanges'라는 플래그를 발견했습니다. 더 낫니? – Incomputable

+0

좋지 않습니다. 그것은 다르다. 두 플래그에서 문서를 확인하고 어떤 상황에서 적합한 지 확인하십시오. – goug