自定义QGraphicsRectItem无法接收mouseMoveEvent

时间:2015-03-03 09:50:25

标签: qt

Item.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的文档,其中说&#34;如果你重新实现了这个函数,默认情况下会接受事件(参见QEvent :: accept()),然后这个项目是鼠标抓取器。这允许项目接收未来的移动,释放和双击事件。&#34;现在我重新实现了它。为什么它不起作用?

2 个答案:

答案 0 :(得分:1)

创建鼠标事件时,将其设置为已接受。根据您为项目设置的标记,the default mousePressEvent implementation可能拒绝该标记。

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

您应该阅读有关活动的this有趣文章。

答案 1 :(得分:0)

启用标志以使用功能

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