Использование событий при наведении

У меня возникли проблемы с захватом событий при наведении и выходе при наведении QGraphicsRectItem,

Я переклассифицировал этот объект и переопределил обработчики при наведении и отпускании при наведении... или, по крайней мере, мне так кажется. Я также установил в конструкторе значение accept hover для true.

Событие никогда не запускается, однако. Точки останова внутри обработчиков никогда не попадают.

Вот класс:

#include "qhgraphicsrectitem.h"

QhGraphicsRectItem::QhGraphicsRectItem(QGraphicsRectItem *parent) :
    QGraphicsRectItem(parent)
{
    setAcceptHoverEvents(true);
    setAcceptsHoverEvents(true);
}

void QhGraphicsRectItem::hoverEnterEvent(QGraphicsSceneHoverEvent *event) {
    oldBrush = brush();
    setBrush(QBrush(QColor((oldBrush.color().red() + (0.5 * (255-oldBrush.color().red()))),(oldBrush.color().green() + (0.5 * (255-oldBrush.color().green()))),(oldBrush.color().blue() + (0.5 * (255-oldBrush.color().blue()))))));
}

void QhGraphicsRectItem::hoverLeaveEvent(QGraphicsSceneHoverEvent *event) {
    setBrush(oldBrush);
}

Что я делаю не так?

2 ответа

Решение

Вы отметили свой hoverEnterEvent а также hoverLeaveEvent как виртуальный? Если вы этого не сделаете, события могут быть вызваны, но QGraphicsItem вместо этого обрабатывает событие.

class QhGraphicsRectItem : public QGraphicsItem
{
    ...
    virtual void hoverEnterEvent(QGraphicsSceneHoverEvent *event);
    virtual void hoverLeaveEvent(QGraphicsSceneHoverEvent *event);
}

Ваш товар находится под QGraphicsItemGroup?

У меня была точно такая же проблема, пока я не нашел эту цитату:

QGraphicsItemGroup это особый тип составного элемента, который обрабатывает себя и всех своих дочерних элементов как один элемент (т. е. все события и геометрии для всех дочерних элементов объединяются). "

(Смотрите здесь: http://qt-project.org/doc/qt-4.8/qgraphicsitemgroup.html)

Это значит, что QGraphicsItemGroup звонки setHandlesChildEvents(true),

Я исправил свою проблему, позвонив parentItem->setHandlesChildEvents(false) в любой (и всех) группах, расположенных над моим элементом, для захвата парящих событий. Пуф! События начали появляться в упомянутых вами виртуальных обратных вызовах.

Другие вопросы по тегам