2014-09-27 234 views
0

我是編程新手,需要幫助。功能:從QGraphicsScene獲取點擊對象

我有一個類Station,其中包含XY領域:

Class Station { 
int x 
int y 
... 
} 

所有站上QGraphicsScene作爲圓和文字繪圖:

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

你嘗試過這麼遠嗎?嘗試發佈[最小,完整和可驗證示例](http://stackoverflow.com/help/mcve)。仔細閱讀http://stackoverflow.com/tour – ericbn 2014-09-27 22:42:50

+0

編輯,謝謝。 – 2014-09-27 22:56:28

回答

0

不,你這樣做不對。我寫了一個小例子。你應該子類QGraphicsScene和重新實現mousePressEvent並處理它的點擊。例如:

的* .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 

在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(); 
     } 

} 

在現場有幾個橢圓形,當你在現場點擊的地方,我們下光標拿到項目,查看其是否它例如是橢圓。如果是,那麼我們爲它設置新的背景。

主要思想是itemAt方法和qgraphicsitem_cast

+0

我會盡力,謝謝 – 2014-09-28 10:11:23

+0

順便說一下,我找到了唯一一種獲得座標的方法: ** ell-> boundingRect()。x()**; ** ell-> boundingRect()。x()** – 2014-10-27 09:55:52