在此代码中,我需要在mousePressEvent(..)
Item
和customGraphicsView
中执行不同的操作。重新定义QGraphicsView
继承类中的鼠标事件处理程序会干扰QGraphicsItem
如何将点击Item
和view
的操作分开,以便它们可以提供不同的行为?
class CustomGraphicsView: public QGraphicsView
{
...
protected:
void mousePressEvent(QMouseEvent * event);
};
class Item: public QGraphicsItem
{
protected:
void mousePressEvent(QMouseEvent * event);
};
class customWidget: public QWidget
{
public:
customWidget(QWidget * parent = 0) ;
...
private:
customGraphicsView * view ;
Item * item ;
};
customWidget::customWidget(QWidget* parent)
:QWidget(parent)
{
view = new customGraphicsView(this) ;
item = new item;
view->addItem(item) ;
}
答案 0 :(得分:1)
您还需要了解QGraphicsView,QGraphicsScene和场景中的任何项目之间的事件处理。 QGraphicsView首先获取事件,将它们转换为场景事件,然后场景将它们传递给相应的项目。如果您没有看到您期望的活动,可能是因为您首先在其他地方拦截了该活动。我发现将调试语句放入每个事件处理程序非常有用,这样我就可以看到事件的来源以及它没有的位置。
答案 1 :(得分:0)
首先,您应该使用QGraphicsSceneMouseEvent
代替QMouseEvent
for QGraphicsItem。
然后为每个mousePressEvent
编写您自己的实现,例如:
void Item::mousePressEvent(QGraphicsSceneMouseEvent *event) {
QGraphicsItem::mousePressEvent(event);
// do everything you was going to
}
和
void CustomGraphicsView::mousePressEvent(QMouseEvent *event) {
QGraphicsView::mousePressEvent(event);
// do everything you was going to
}
答案 2 :(得分:0)
感谢您的回答,但我不得不删除QGraphicsItem鼠标事件并通过QGraphicsView实现代码
void CustomGraphicsView::mousePressEvent(QMouseEvent * event)
{
Item * pressedItem ;
pressPoint = event->pos();
if(scene())
{
if (!items().isEmpty())
{
QPointF scenePoint = mapToScene(event->pos()) ;
QGraphicsItem * item = scene()->itemAt(scenePoint, transform());
if(pressedItem = dynamic_cast<Item*>(item))
{
//code for item press, instead of using QGraphicsItem::mousePressEvent(QGraphicsSceneMouseEvent * event)
pressedItem->setColor(Qt::red);
}
}
}
}