2015-03-03 41 views
0

Item.h:定製QGraphicsRectItem不能接收mouseMoveEvent

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()),這個項目是老鼠抓取器。 「現在我已經重新實現它,爲什麼它不起作用?

+0

你是說它沒有'工作還是它工作? – thuga 2015-03-03 10:01:39

+0

它不起作用。我很好奇qt知道我是否在重新實現基本實現時重新實現了這個函數。@ thuga – Nya 2015-03-03 10:32:50

回答

1

當鼠標事件被創建時,它被設置爲被接受。根據您擁有的標誌設爲您的項目,the default mousePressEvent implementation可能會拒絕它。

在你的情況,你在呼喚它可能會拒絕鼠標按下事件默認實現。如果是這樣的情況下,mouseMoveEvent將永遠不會被調用。

你應該閱讀this關於事件的有趣文章

+0

即使我在重新實現結束時調用accept(),它也不起作用。 – Nya 2015-03-03 10:52:04

+0

@Nya適合我。調用基類實現後調用'accept'使其調用'mouseMoveEvent'。 – thuga 2015-03-03 11:14:32

+0

什麼****。你可以請嘗試運行我的代碼?我現在幾乎崩潰了 – Nya 2015-03-03 11:23:15