从QGraphicsPixmapItem派生的类不接受标志,因此不能将其设置为可移动

时间:2015-11-09 13:26:15

标签: c++ qt

我正在使用QGraphicsScene,我希望有一些物品在移动时发出信号。

不幸的是,QGraphicsPixmapItem没有任何信号,所以我将其分类:

class InteractiveGraphicsPixmapItem : public QObject, public QGraphicsPixmapItem
{
    Q_OBJECT

public:
    InteractiveGraphicsPixmapItem();

    InteractiveGraphicsPixmapItem(QPixmap pm) : QGraphicsPixmapItem(pm)
    {
        setFlag(QGraphicsItem::ItemIsMovable, true);
        setAcceptedMouseButtons(Qt::LeftButton|Qt::RightButton);
    }

private:
    void mouseMoveEvent(QGraphicsSceneMouseEvent *);

signals:
    void moved_by_mouse(QPointF newpos);

};


InteractiveGraphicsPixmapItem::InteractiveGraphicsPixmapItem()
{
}

void InteractiveGraphicsPixmapItem::mouseMoveEvent(QGraphicsSceneMouseEvent *)
{
    emit moved_by_mouse(this->pos());
}

然而,它不可移动。 如果我将其更改回主程序中的QGraphicsPixmapItem,并调用item->setFlags(QGraphicsItem::ItemIsMovable);它将变为可移动。对于我的自定义课程,它没有。

item = new InteractiveGraphicsPixmapItem(QPixmap(":/img/icon.png"));
scene->addItem(item);
item->setFlags(QGraphicsItem::ItemIsMovable);

有人问similar question有关可选性的问题,并建议必须将setAcceptedMouseButtons(Qt::LeftButton|Qt::RightButton);添加到构造函数中。在我的案例中,它没有任何帮助。

1 个答案:

答案 0 :(得分:2)

如果你覆盖了mouseMoveEvent,并且没有调用基类的功能,它就不会移动,你必须自己处理它。

但是,这里只需要调用基类函数

void InteractiveGraphicsPixmapItem::mouseMoveEvent(QGraphicsSceneMouseEvent* evt)
{
    QGraphicsPixmapItem::mouseMoveEvent(evt);
    emit moved_by_mouse(this->pos());
}

另请注意,如果您覆盖其中一个鼠标事件(按下/释放/移动),您也应该处理其他事件。