我正在使用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);
添加到构造函数中。在我的案例中,它没有任何帮助。
答案 0 :(得分:2)
如果你覆盖了mouseMoveEvent,并且没有调用基类的功能,它就不会移动,你必须自己处理它。
但是,这里只需要调用基类函数
void InteractiveGraphicsPixmapItem::mouseMoveEvent(QGraphicsSceneMouseEvent* evt)
{
QGraphicsPixmapItem::mouseMoveEvent(evt);
emit moved_by_mouse(this->pos());
}
另请注意,如果您覆盖其中一个鼠标事件(按下/释放/移动),您也应该处理其他事件。