2013-06-04 2 views
3

qGraphicsScene 및 사용자 지정 qGraphicsItem을 사용자 정의하여 구현했지만 itemAt 함수는 값을 반환하지 않습니다. 물론 항목을 클릭하고있는 것이 확실합니다.item qGraphicsItem을 사용자 지정하지 않음

void VScene::addModule(QString modName, QPointF dropPos) 
{ 
    VModule *module = new VModule(); 
    addItem(module); 
    // the QPointF value comes from an event in mainWindow, the coordinate is mapped to my scene. 
    module->setPos(dropPos); 
} 

을 ... 그리고 여기에 내가 작성한 사용자 정의 qGraphicsItem은 다음과 같습니다

void VScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) 
{ 
    if ((vMouseClick) && (event->pos() == vLastPoint)) { 
     QGraphicsItem *mod = itemAt(event->pos(), QTransform()); 
     if (mod) { // Never returns true 
      // ... 
     } 
    } 
} 

는 명확하게하기 위해, 모듈은 다음 코드에 추가됩니다.

VModule.h :

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

    private: 
     qreal w; 
     qreal h; 
     int xAddr; 
     int yAddr; 
     QPolygonF baseShape; 
} 

VModule.cpp :

VModule::VModule() 
{ 
    w = 80; 
    h = 80; 
    xAddr = w/2; 
    yAddr = h/2; 

    // Use the numbers to create a number of polygons 
    QVector<QPointF> basePoints = { QPointF(0.0, 0.0), 
            QPointF(xAddr, yAddr), 
            QPointF(0.0, yAddr * 2), 
            QPointF(-xAddr, yAddr) }; 
    baseShape = QPolygonF(basePoints); 
} 

QRectF VModule::boundingRect() const 
{ 
    return QRectF(-xAddr, 0, w, h); 
} 

void VModule::paint(QPainter *painter, const QStypeOptionGraphicsItem *option, QWidget *widget) 
{ 
    // brushes and so on are set 
    // ... 

    painter->drawPolygon(baseShape, qt::OddEvenFill); 

    // there are other polygons are drawn in the same way as above 
} 

내 구현에 문제가 있습니까? 제가 누락 된 것이 있습니까? 모든 도움을 미리 감사드립니다.

+0

이 몇 가지 좌표 변환 문제가 될 수 있습니다 (예를 들어, 당신은 절대 화면 좌표를 얻을 수 있지만, 장면은 자신의 좌표 예상) 잘 모르겠어요 동안 이벤트가에서 생성 및 처리 Lol4t0 @ – Lol4t0

+0

나는 절대 좌표가 문제라고 생각하지 않는다. AFAIK QGraphicsItem도 장면 좌표를 사용합니까? – c0nn

답변

3

장면 좌표 대신 항목 좌표에서 장면을 쿼리하고 있습니다. 사용 :

... 
QGraphicsItem *mod = itemAt(event->scenePos()); 
... 
+0

하, 고맙게 생각 했어, 고마워. 컴파일러는 변환 인수를 생략하지 않습니다. 그 이유는 무엇입니까? – c0nn

+0

나는 문서를 잘못 읽었 기 때문에! 내 게시물을 편집합니다 ... – cmannett85

+2

변환은보기에서 이루어져야합니다. 그래서'QGraphicsView' 인 경우'QGraphicsSceneMouseEvent :: widget()'멤버를 테스트해야하고, 그렇다면'transform()'을 추출해야합니다. – cmannett85

관련 문제