在我的应用程序中,我有两个对象类型。一个是字段项,另一个是复合项。 复合项目可能包含两个或多个字段项目。 这是我的复合项目实现。
#include "compositeitem.h"
CompositeItem::CompositeItem(QString id,QList<FieldItem *> _children)
{
children = _children;
}
CompositeItem::~CompositeItem()
{
}
QRectF CompositeItem::boundingRect() const
{
FieldItem *child;
QRectF rect(0,0,0,0);
foreach(child,children)
{
rect = rect.united(child->boundingRect());
}
return rect;
}
void CompositeItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget )
{
FieldItem *child;
foreach(child,children)
{
child->paint(painter,option,widget);
}
}
QSizeF CompositeItem::sizeHint(Qt::SizeHint which, const QSizeF &constraint) const
{
QSizeF itsSize(0,0);
FieldItem *child;
foreach(child,children)
{
// if its size empty set first child size to itsSize
if(itsSize.isEmpty())
itsSize = child->sizeHint(Qt::PreferredSize);
else
{
QSizeF childSize = child->sizeHint(Qt::PreferredSize);
if(itsSize.width() < childSize.width())
itsSize.setWidth(childSize.width());
itsSize.setHeight(itsSize.height() + childSize.height());
}
}
return itsSize;
}
void CompositeItem::contextMenuEvent(QGraphicsSceneContextMenuEvent *event)
{
qDebug()<<"Test";
}
我的第一个问题是如何将上下文菜单事件传播给特定的孩子。
composite1 http://img169.imageshack.us/img169/9079/composite1.jpg
上面的图片展示了我可能的复合项目之一。
如果您查看上面的代码,您会看到我在上下文菜单事件发生时打印“测试”。
当我右键单击线符号时,我看到“Test”消息被打印出来。 但是,当我右键单击信号符号时,“Test”不会被打印,我希望它被打印出来。
我的第二个问题导致这种行为的原因。 我该如何克服这一点。
答案 0 :(得分:0)
您可以尝试使用mouseRelease事件重新实现contextMenu吗?
void CompositeItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
{
if(event->button() == Qt::RightButton)
{
contextMenu->popup(QCursor::pos());
}
}
答案 1 :(得分:0)
我发现可能有两种捕获事件的解决方案。 第一个是重新实现shape功能。 就我而言,它将像这样实现。
QPainterPath shape() const
{
QPainterPath path;
path.addRect(boundingRect());
return path;
}
第二个是使用QGraphicsItemGroup
如果您直接将项目添加到场景中,最好使用QGraphicsItemGroup。但在我的情况下,我必须子类QGraphicsItemGroup,因为我正在使用布局。
所以暂时我选择自己编写项目。