2013-08-28 84 views
1

我有兩個類型的QGraphicsRectItem項。一個在另一個。Qt:兒童圖形項目懸停事件

第一個是名爲Wall的自定義類。牆內有門窗。實際上,我在這個自定義Wall類中有一個門和Windows的列表。

門也是項目,並繪製在牆內。

當我將鼠標移動到門上時,牆上的懸停功能被命中,但門的懸停不是。他們都正確複製了一個虛擬無效保護。

這是爲什麼發生?我怎樣才能讓門窗項目意識到懸停?

+0

爲什麼不定義牆上作爲父類和門窗的牆體子!?! – dare

回答

3

我試着用自定義QGraphicsItem而不是自定義QGraphicsRectItem。似乎懸浮事件處理程序已成功調用WallDoor。這在QGraphicsItemsetAcceptHoverEvents(true)明確設置時發生。這不是自定義QGraphicsRectItem測試。

Screenshot

#include <QApplication> 
#include <QGraphicsScene> 
#include <QGraphicsView> 
#include <QGraphicsItem> 
#include <QPainter> 

class Item : public QGraphicsItem 
{ 
    QBrush m_brush; 
public: 
    explicit Item(bool nested = true, QGraphicsItem* parent = 0) : QGraphicsItem(parent), m_brush(Qt::white) 
    { 
     if (nested) { 
      Item* item = new Item(false, this); 
      item->setPos(10,10); 
      m_brush = Qt::red; 
     } 
     setAcceptHoverEvents(true); 
    } 
    QRectF boundingRect() const 
    { 
     return QRectF(0,0,100,100); 
    } 
    void hoverEnterEvent(QGraphicsSceneHoverEvent *) 
    { 
     m_brush = Qt::red; 
     update(); 
    } 
    void hoverLeaveEvent(QGraphicsSceneHoverEvent *) 
    { 
     m_brush = Qt::white; 
     update(); 
    } 
    void paint(QPainter *p, const QStyleOptionGraphicsItem *, QWidget *) 
    { 
     p->setBrush(m_brush); 
     p->drawRoundRect(boundingRect()); 
    } 
}; 

int main(int argc, char *argv[]) 
{ 
    QApplication app(argc, argv); 
    QGraphicsScene scene; 
    scene.addItem(new Item); 
    QGraphicsView view; 
    view.setScene(&scene); 
    view.setMouseTracking(true); 
    view.show(); 
    return app.exec(); 
} 
+0

完美!將標誌設置爲true對我來說是完美的解決方案。 非常感謝! – darkgaze