功能:从QGraphicsScene获取单击的对象

时间:2014-09-27 22:32:08

标签: c++ qt coordinates qgraphicsitem 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()));

但程序崩溃了......

1 个答案:

答案 0 :(得分:1)

不,你做错了。我写了一个小例子。您应该继承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