2013-05-16 2 views
0

내 장면에서 사용자 지정 QGraphicsItem을 생성하려고 시도했지만 지점을 원점에서 항목으로 얼마나 정확하게 매핑해야하는지 확신 할 수 없습니다. 내 위치 내 MainWindow를에 dropEvent에서 온다 :MainWindow에서 QGraphicsItem으로 매핑하는 방법은 무엇입니까?

void MainWindow::dropEvent(QDropEvent *event) 
{ 
    QPointF dropPos = ui->GraphicsView->mapFrom(this, event->pos()); 
    vModule *module = new vModule(dropPos); 
    ui->GraphicsView->scene->addItem(module); 
} 

이 내 vModule.cpp입니다 :

vModule::vModule(QPointF dropPos) 
{ 
    QPointF pos = mapFromScene(dropPos); 
    setX(pos.x()); 
    setY(pos.y()); 
    // ... 
} 

// Event handler implementation, shouldn't be relevant 

그리고 내 vModule.h :

class vModule : public QObject, public QGraphicsItem 
{ 
public: 
    explicit vModule(QPointF dropPos); 
    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); 
    QRectF boundingRect() const; 

protected: 
    void mouseReleaseEvent(QGraphicsSceneMouseEvent *event); 
    void mousePressEvent(QGraphicsSceneMouseEvent *event); 
} 

이에 가장 가까운 것 나는 논리적으로 변환이 될 것이라고 생각했지만, 실제 상황에서는 이벤트의 위치를 ​​그대로 전달하는 것보다 더 잘못되었습니다. (메인 윈도우와 위치가 일정한 차이가 있습니까?). 아무도 내 오류를 수정할 수 있습니까?

+0

그래서 좌표를 매핑하여 문제를 해결했습니다 ... 세 번. 드롭 시작하는 좌표, 나는 다음과 같은 방법으로지도 : 드롭 위치 -> drawArea (mapFromParent) -> drawArea (mapToScene) -> graphicsItem (mapFromScene)이 매핑 모두가 MainWindow를에서 수행된다. 그래도이 작업을 수행하는 더 좋은 방법이있을 것입니다 ... – c0nn

답변

1

vModule의 생성자에서 위젯이 장면에 추가되기 전에 mapFromScene을 호출합니다.

위젯을 먼저 추가 한 다음 위치를 설정하십시오. 또한 생각하면 글로벌 (화면) 좌표에서 로컬 위젯 좌표로 이동합니다. 이 함수는 드롭 이벤트 좌표가 화면 공간에 가정 유용 할 수있다 : - :

- Qt는 도움으로 정의

의 QPoint는 QWidget :: mapFromGlobal (CONST의 QPoint & POS) CONST

글로벌 화면 좌표 pos를 위젯 좌표로 변환합니다.

+0

DropEvents가 글로벌 좌표로 만들어 졌습니까? 나는 이것을 몰랐다. 이것은 드래그 이벤트가 생성 된 위치에 따라 좌우됩니까? 또한 vModule에서 매핑을 동일하게 유지하면서 전역 좌표에서 매핑해도 작동하지 않았습니다. 창 크기를 조정하면 놓기 위치가 사라져 vModule의 매핑이 잘못되었다고 생각하게됩니다. – c0nn

+0

내 질문에 대한 의견으로 게시 된 솔루션은 작동하지만 더 나은 방법이 있어야합니다. – c0nn

+0

mapFromGlobal을 사용하지 않는 경우 문제를 더 작은 단계로 나눕니다. 드롭 좌표를 사용하지 않고 객체를 만들고 장면에 추가 한 다음 장면 위치를 설정하면됩니다. 따라서 드롭 좌표를 사용하여보기 (놓기) 좌표를 가져 와서 장면 좌표에 매핑 한 다음 위젯의 위치를 ​​설정해야합니다. 또한 위젯 생성자에서 setPos를 사용하면 setX()가 y()를 호출하고 setY()가 x()를 호출 할 때보다 효율적입니다. 부모가 없으면 setPos가 부모 또는 장면 코드를 기준으로 좌표를 설정하므로 위젯 생성자에서 mapFromScene을 호출 할 필요가 없습니다. – TheDarkKnight

관련 문제