我是编程新手,需要帮助。
我有一个班级Station
,其中包含X
和Y
个字段:
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 :(得分: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