我有兩個類型的QGraphicsRectItem項。一個在另一個。Qt:兒童圖形項目懸停事件
第一個是名爲Wall的自定義類。牆內有門窗。實際上,我在這個自定義Wall類中有一個門和Windows的列表。
門也是項目,並繪製在牆內。
當我將鼠標移動到門上時,牆上的懸停功能被命中,但門的懸停不是。他們都正確複製了一個虛擬無效保護。
這是爲什麼發生?我怎樣才能讓門窗項目意識到懸停?
我有兩個類型的QGraphicsRectItem項。一個在另一個。Qt:兒童圖形項目懸停事件
第一個是名爲Wall的自定義類。牆內有門窗。實際上,我在這個自定義Wall類中有一個門和Windows的列表。
門也是項目,並繪製在牆內。
當我將鼠標移動到門上時,牆上的懸停功能被命中,但門的懸停不是。他們都正確複製了一個虛擬無效保護。
這是爲什麼發生?我怎樣才能讓門窗項目意識到懸停?
我試着用自定義QGraphicsItem
而不是自定義QGraphicsRectItem
。似乎懸浮事件處理程序已成功調用Wall
和Door
。這在QGraphicsItem
與setAcceptHoverEvents(true)
明確設置時發生。這不是自定義QGraphicsRectItem
測試。
#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();
}
完美!將標誌設置爲true對我來說是完美的解決方案。 非常感謝! – darkgaze
爲什麼不定義牆上作爲父類和門窗的牆體子!?! – dare