自定义 QGraphicsRectItem 无法接收 mouseMoveEvent

Posted

技术标签:

【中文标题】自定义 QGraphicsRectItem 无法接收 mouseMoveEvent【英文标题】:Custom QGraphicsRectItem cannot receive mouseMoveEvent 【发布时间】:2015-03-03 09:50:24 【问题描述】:

项目.h:

class Item:public QGraphicsRectItem

public:
    Item(const QRectF & rect, QGraphicsItem * parent = 0);
    void mousePressEvent(QGraphicsSceneMouseEvent * event);
    void ​mouseMoveEvent(QGraphicsSceneMouseEvent * event);
    ~Item();
;

Item.cpp:

Item::Item(const QRectF & rect, QGraphicsItem * parent)
    :QGraphicsRectItem(rect, parent)


void Item::mousePressEvent(QGraphicsSceneMouseEvent * event)
    qDebug("press");
    QGraphicsRectItem::mousePressEvent(event);
    event->accept();

void Item::​mouseMoveEvent(QGraphicsSceneMouseEvent * event)
    qDebug("move");

Item::~Item()


main.cpp:

#include "mainwindow.h"
#include <QApplication>
#include "QGraphicsView"
#include "QGraphicsScene"
#include "item.h"

int main(int argc, char *argv[])

    QApplication a(argc, argv);
 //   MainWindow w;
 //   w.show();

    auto item = new Item(QRectF(QPointF(),QSize(100,150)));

    auto scene = new QGraphicsScene;
    scene->addItem(item);

    auto view = new QGraphicsView(scene);
    view->setMinimumSize(QSize(800,600));
    view->scene()->setSceneRect(QRectF(QPointF(),view->size()));
    view->show();

    return a.exec();

我已经阅读了关于 QGraphicsItem::​mousePressEvent 的文档,其中说“如果你重新实现这个函数,默认情况下会接受事件(参见 QEvent::accept()),然后这个项目就是鼠标抓取器。这允许项目接收未来的移动、释放和双击事件。”现在我重新实现了它。为什么它不起作用?

【问题讨论】:

你是说它不起作用还是它起作用? 它不起作用。我很好奇当我在重新实现它时保留基本实现时,qt如何知道我是否已经重新实现了这个功能。@thuga 【参考方案1】:

当鼠标事件被创建时,它被设置为接受。根据您为项目设置的标志,the default mousePressEvent implementation 可能会拒绝它。

在您的情况下,您正在调用可能拒绝鼠标按下事件的默认实现。如果是这种情况,mouseMoveEvent 将永远不会被调用。

你应该阅读this关于事件的有趣文章。

【讨论】:

即使我在重新实现结束时调用 accept() 也不起作用。 @Nya 对我来说很好。在调用基类实现后调用accept 使其调用mouseMoveEvent 什么****。你能尝试运行我的代码吗?我现在快疯了 我的代码和你的差不多。唯一的区别是mousePresseEvent我在调用基类实现后调用event-&gt;accept(); 请压缩您的项目文件并发送到我的电子邮件:callmetsing@gmail.com。谢谢【参考方案2】:

启用标志以使用功能

item ->setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable);
item ->setAcceptHoverEvents(true);
item ->setAcceptedMouseButtons(Qt::LeftButton);

【讨论】:

以上是关于自定义 QGraphicsRectItem 无法接收 mouseMoveEvent的主要内容,如果未能解决你的问题,请参考以下文章

如果传递给 QGraphicsRectItem Qt c++,则更改光标

QGraphicsRectItem中如何实现信号和槽?子类化 qobject 和 qgraphicsrectitem 但出现错误

QGraphicsRectItem 的几何形状

QGraphicsRectItem.boundingRect() 在移动期间未更新

QGraphicsView Scale & QGraphicsRectItem 绘画未能调用

调整 QGraphicsRectItem 的大小和重新绘制的 PyQt 问题