2014-09-27 2 views
0

저는 프로그래밍 초보자이며 도움이 필요합니다.기능 : QGraphicsScene에서 클릭 한 개체 얻기

Class Station { 
int x 
int y 
... 
} 

모든 스테이션 동그라미와 텍스트로 QGraphicsScene에 그리는 :

내가 XY 필드를 포함하는 클래스 Station이,이

this->scene.addEllipse(x1, y1, diam, diam, pen, QBrush(...)); 

나는 기능을 필요 getClickedStation , QGraphicsScene을 클릭하기를 기다리고 서클을 찾고 좌표의 해당 역을 반환합니다 :

Station* getClickedStation(...) { ... } 

어떤 방법이 있습니까?

난 그냥 좌표를 얻을이 시도했습니다 ... 그것으로

QList<QGraphicsItem*> listSelectedItems = scene.selectedItems(); 
QGraphicsItem* item = listSelectedItems.first(); 
ui->textBrowserMenu->append(QString::number(item->boundingRect().x())); 
ui->textBrowserMenu->append(QString::number(item->boundingRect().y())); 

하지만, 프로그램 충돌을

+0

입니까? [Minimal, Complete, Verifiable example] (http://stackoverflow.com/help/mcve)를 게시하십시오. 또한, http://stackoverflow.com/tour – ericbn

+0

편집 됨, 감사합니다. –

답변

0

아니, 당신은 잘못 않습니다. 나는 작은 예를 썼다. QGraphicsScene을 서브 클래스 화하고 mousePressEvent을 다시 구현하고 그 안에 클릭을 처리해야합니다. 예를 들어 몇 타원가 현장에 CPP

void GraphicsScene::mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent) 
{ 
    //qDebug() << "in"; 
    if (mouseEvent->button() == Qt::LeftButton) 
    { 
     QGraphicsItem *item = itemAt(mouseEvent->scenePos(), QTransform());// it is your clicked item, you can do everything what you want. for example send it somewhere 
     QGraphicsEllipseItem *ell = qgraphicsitem_cast<QGraphicsEllipseItem *>(item); 
     if(ell) 
     { 
      ell->setBrush(QBrush(Qt::black)); 
     } 
     else 
      qDebug() << "not ell" << mouseEvent->scenePos(); 
     } 

} 

에서

* .H

#ifndef GRAPHICSSCENE_H 
#define GRAPHICSSCENE_H 

#include <QGraphicsScene> 
#include <QPoint> 
#include <QMouseEvent> 
class GraphicsScene : public QGraphicsScene 
{ 
    Q_OBJECT 
public: 
    explicit GraphicsScene(QObject *parent = 0); 

protected: 
    void mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent); 
}; 

#endif // GRAPHICSSCENE_H 

, 당신이 장면 어딘가에 클릭 할 때 우리는 커서 아래 항목을 얻고 그것이 확인 그것은 예를 들어 타원이다. 그렇다면 새로운 배경을 설정합니다.

주요 아이디어는 itemAt 방법 지금까지 시도 무엇 qgraphicsitem_cast

+0

감사합니다. –

+0

그런데 좌표를 얻는 유일한 방법은 하나뿐입니다. ** ell-> boundingRect(). x() **; ** ell-> boundingRect(). x() ** –