gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 02:17:30 28 4
gpt4 key购买 nike

我正在使用 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);

A similar question被问及可选择性,建议必须将 setAcceptedMouseButtons(Qt::LeftButton|Qt::RightButton); 添加到构造函数中。它对我的情况没有帮助。

最佳答案

如果您重写 mouseMoveEvent,并且不调用基类的函数,它不会移动,您必须自己处理。

然而,这里只需调用基类函数即可

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

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

关于c++ - 从 QGraphicsPixmapItem 派生的类不接受标志,因此不能将其设置为可移动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33610152/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com