2011-08-03 1 views
0

마우스 클릭시 및 마우스 커서 좌표에서 QGraphicsScene에 일부 사용자 지정 QGraphicsItems를 추가하려고합니다. 그러나 항목은 마우스 커서와 동일한 좌표에 추가되지 않습니다. 를 QGraphicsView 및 Clothoids 사용자 정의 QGraphicsItemQGraphicsScene에 항목을 추가하는 방법은 무엇입니까?

 

    Clothoid::Clothoid(QPoint startPoint, QPoint endPoint) 
    { 
     sPoint = startPoint; 
     ePoint = endPoint; 
     startCurvature = 0.0; 
     endCurvature = 0.0; 
     clothoidLength = sqrt(pow(endPoint.x() - startPoint.x(),2) + 
           pow(endPoint.y() - startPoint.y(),2)); 
    }  

    QRectF Clothoid::boundingRect() const 
     { 
      qreal penWidth = 1; 

      if ((sPoint.x() < ePoint.x()) && (sPoint.y() < ePoint.y())) 
       return QRectF(sPoint.x(), sPoint.y(), ePoint.x() - sPoint.x(), ePoint.y()-sPoint.y()) 
       .normalized() 
       .adjusted(-penWidth, -penWidth, penWidth, penWidth); 

      if ((sPoint.x() < ePoint.x()) && (sPoint.y() > ePoint.y())) 
       return QRectF(sPoint.x(), ePoint.y(), ePoint.x() - sPoint.x(), sPoint.y() - ePoint.y()) 
       .normalized() 
       .adjusted(-penWidth, -penWidth, penWidth, penWidth); 

      if ((sPoint.x() > ePoint.x()) && (sPoint.y() < ePoint.y())) 
       return QRectF(ePoint.x(), sPoint.y(), sPoint.x() - ePoint.x(), ePoint.y()-sPoint.y()) 
       .normalized() 
       .adjusted(-penWidth, -penWidth, penWidth, penWidth); 

      if ((sPoint.x() > ePoint.x()) && (sPoint.y() > ePoint.y())) 
       return QRectF(ePoint.x(), ePoint.y(), sPoint.x() - ePoint.x(), sPoint.y() - ePoint.y()) 
       .normalized() 
       .adjusted(-penWidth, -penWidth, penWidth, penWidth); 

      return QRectF(); 

     } 

     void Clothoid::paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *) 
     { 
      QLineF line(sPoint, ePoint); 

      // Draw the line itself 
      painter->setPen(QPen(Qt::black, 1, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin)); 
      painter->drawLine(line); 
     } 

내가 좌표가 나는 항목을 삽입하고있는 것으로 추측하고있다 인

 

    renderArea::renderArea(QWidget *parent): 
      QGraphicsView(parent) 
    { 
     scene = new QGraphicsScene(this); 
     scene->setItemIndexMethod(QGraphicsScene::NoIndex); 
     scene->setSceneRect(0, 0, 850, 480); 
     setScene(scene); 
     setCacheMode(CacheBackground); 
     setViewportUpdateMode(BoundingRectViewportUpdate); 
     setRenderHint(QPainter::Antialiasing); 
     setTransformationAnchor(AnchorUnderMouse); 
     scale(qreal(1.0), qreal(1.0)); 
     setMinimumSize(400, 400); 
    } 

    void renderArea::mousePressEvent(QMouseEvent *event) 
    { 
     QPoint p = event->pos(); 

    updateList(p); 
    } 

    void renderArea::updateList(const QPoint &p) 
    { 
     Point point; 
     point.point = p; 
     point.isSelected = false; 
     list.append(point); 
     if (list.size() > 1) 
      updateClothoid(list[list.size()-2].point, list[list.size()-1].point); 
    } 

    void renderArea::updateClothoid(const QPoint &p1, const QPoint &p2) 
    { 
     Clothoid *temp = new Clothoid(p1, p2); 

     clothoids.append(temp); 

     scene->addItem(temp); 
    } 

renderArea는 GraphicsView에 속하고 내 응용 프로그램 장면으로하지 장면 전체보기를 다루지는 않습니다. 하지만 내 경우에는 어떻게 장면 좌표를 얻을 수 있습니까?

답변

1

당신은 맞다는 좌표에서 찍은 GraphicView 아닌 장면

에 상대되는 Qt's documentation :

가받은 위젯을 기준으로 마우스 커서의 위치를 ​​돌려줍니다 행사. 마우스 이벤트의 결과로 위젯을 움직이는 경우, 흔들리는 것을 피하기 위해 globalPos()가 반환 한 전역 위치를 사용하십시오.

는 희망, 그들은 편의 기능 (excerpt from the QGraphicsView doc)을 제공 :

또한를 QGraphicsView의 서브 클래스를 만들고, 마우스 및 키 이벤트 핸들러를 재 구현하여 사용자 정의 장면 상호 작용을 제공 할 수 있습니다. 뷰의 항목과 프로그래밍 방식으로 상호 작용하는 방법을 단순화하기 위해 QGraphicsView는 mapToScene() 및 mapFromScene() 및 항목 접근 자 items() 및 itemAt()의 매핑 함수를 제공합니다. 이 함수를 사용하면 뷰 좌표와 장면 좌표 간의 점, 사각형, 다각형 및 경로를 매핑하고 뷰 좌표를 사용하여 장면에서 항목을 찾을 수 있습니다. 조심, mapToScene()QPointF 아닌 QPoint 반환

그래서, 당신이 찾고있는 기능은 renderArea 편집이

void renderArea::mousePressEvent(QMouseEvent *event) 
{ 
    QPoint p = mapToScene(event->pos()); 
    updateList(p); 
} 

를 QGraphicsView

에서 상속 때문에 직접 호출 할 수 mapToScene()입니다. 문제는 아니지만이 사실을 알고 있어야합니다.