1

我的班级结构是:

一个名为FloatingButtonItem的类继承了QGraphicsPixmapItem

class FloatingButtonItem : public QGraphicsPixmapItem
{

(...) 并重新实现这五个函数。

protected:

void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
void mousePressEvent(QGraphicsSceneMouseEvent *event);
void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
void hoverEnterEvent(QGraphicsSceneHoverEvent *event);
void hoverLeaveEvent(QGraphicsSceneHoverEvent *event);

他们每个人都只是改变一个布尔变量的值并打印一条消息。

构造函数中我有:

FloatingButtonItem::FloatingButtonItem(MyGraphicsScene* scene,  QGraphicsItem* parent) :  QGraphicsPixmapItem(parent)

FloatingButton 被完美地绘制,但未收到悬停事件

在你问它之前:是的,我在创作中添加了这一行:

  **setAcceptHoverEvents(true);**
  setFlag(ItemIsMovable, true);
  setFlag(ItemSendsGeometryChanges, true);
  setZValue(20.0);

并且该项目完美地出现在其余项目的前面。

创建它之后,我使用“addItem”函数将它添加到场景中。

创作有问题吗?与育儿?

另一方面,我有另一个继承自QGraphicsPolygonItem的类,以及我称之为 GenericItem 的类,它是这样创建的:

class GenericItem : public QObject {

Q_OBJECT

...

它确实适用于悬停事件。显然是一样的......添加 Q_OBject 并使其继承自 QObject 不起作用。

编辑:我添加另一条评论:我检查了边界矩形。没关系。大小不为 0。

编辑2: 关于边界框:

我也重新实现了 boundingRect 函数:

QRectF boundingRect () const { return boundingRect_; }   

并且在创建中使用像这样选择的 Pixmap 计算边界矩形:

boundingRect_ = QRectF( -pix.width()/2, -pix.height()/2, pix.width() , pix.height());
setPos(-pix_.width()/2,-pix_.height()/2);

有任何想法吗?

4

1 回答 1

1

您声明这是您的类的构造函数:-

FloatingButtonItem::FloatingButtonItem(MyGraphicsScene* scene,  QGraphicsItem* parent) 
      :  QGraphicsPixmapItem(parent,scene)

如果您查看 QGraphicsPixmapItem 的构造函数,文档会显示这些:-

QGraphicsPixmapItem(QGraphicsItem * parent = 0)
QGraphicsPixmapItem(const QPixmap & pixmap, QGraphicsItem * parent = 0)

两个构造函数都将 QGraphicsScene 作为第二个参数,这是您传递给基类的参数。

您应该创建您的像素图项目并调用:-

pScene->addItem(floatingButtonItem);
于 2013-11-14T11:58:28.980 回答