16 : QItemDelegate(pParent)
20 virtual bool mouseHoverEvent(QHoverEvent* pEvent,
const QStyleOptionViewItem& option,
const QModelIndex& index) {
return false; }
21 virtual bool mousePressEvent(QMouseEvent* pEvent,
const QStyleOptionViewItem& option,
const QModelIndex& index) {
return false; }
22 virtual bool mouseReleaseEvent(QMouseEvent* pEvent,
const QStyleOptionViewItem& option,
const QModelIndex& index) {
return false; }
23 virtual bool mouseDoubleClickEvent(QMouseEvent* pEvent,
const QStyleOptionViewItem& option,
const QModelIndex& index) {
return false; }
24 virtual bool mouseMoveEvent(QMouseEvent* pEvent,
const QStyleOptionViewItem& option,
const QModelIndex& index) {
return false; }
36 this->setAttribute(Qt::WA_Hover,
true);
39 virtual bool event(QEvent* pEv)
override
43 case QEvent::HoverEnter:
44 case QEvent::HoverMove:
45 case QEvent::HoverLeave:
47 QHoverEvent* pHoeverEvent =
static_cast<QHoverEvent*
>(pEv);
50#if QT_VERSION <= QT_VERSION_CHECK(5, 14, 0)
51 QPoint pos = pHoeverEvent->pos();
53 QPoint pos = pHoeverEvent->position().toPoint();
55 QModelIndex index = this->indexAt(pos);
56 if (m_Hovered.isValid() && (pEv->type() == QEvent::HoverLeave || index != m_Hovered))
58 QHoverEvent hoverEvent(QEvent::HoverLeave, pos, pHoeverEvent->globalPosition(), pHoeverEvent->oldPos(), pHoeverEvent->modifiers());
59 ForwardEvent(m_Hovered, &hoverEvent);
60 m_Hovered = QModelIndex();
62 if (index.isValid() && pEv->type() != QEvent::HoverLeave && !m_Hovered.isValid())
64 QHoverEvent hoverEvent(QEvent::HoverEnter, pos, pHoeverEvent->globalPosition(), pHoeverEvent->oldPos(), pHoeverEvent->modifiers());
66 ForwardEvent(m_Hovered, &hoverEvent);
68 else if (m_Hovered.isValid())
70 QHoverEvent hoverEvent(QEvent::HoverMove, pos, pHoeverEvent->globalPosition(), pHoeverEvent->oldPos(), pHoeverEvent->modifiers());
71 ForwardEvent(m_Hovered, &hoverEvent);
79 return Base::event(pEv);
82 virtual void mousePressEvent(QMouseEvent* pEvent)
override
84 QPoint pos = pEvent->pos();
85 QModelIndex index = this->indexAt(pos);
86 if (ForwardEvent(index, pEvent))
88 if (!m_Focused.isValid())
91 this->viewport()->grabMouse();
96 Base::mousePressEvent(pEvent);
100 virtual void mouseReleaseEvent(QMouseEvent* pEvent)
override
102 if (m_Focused.isValid())
104 ForwardEvent(m_Focused, pEvent);
105 if (pEvent->buttons() == Qt::NoButton)
107 m_Focused = QModelIndex();
108 this->viewport()->releaseMouse();
113 Base::mouseReleaseEvent(pEvent);
117 virtual void mouseDoubleClickEvent(QMouseEvent* pEvent)
override
119 QPoint pos = pEvent->pos();
120 QModelIndex index = this->indexAt(pos);
121 if (!ForwardEvent(index, pEvent))
123 Base::mouseDoubleClickEvent(pEvent);
127 virtual void mouseMoveEvent(QMouseEvent* pEvent)
override
129 QPoint pos = pEvent->pos();
130 QModelIndex index = this->indexAt(pos);
131 if (!ForwardEvent(index, pEvent))
133 Base::mouseMoveEvent(pEvent);
138 bool ForwardEvent(QModelIndex index, QEvent* pEvent)
140 if (m_Focused.isValid())
142 if (!index.isValid())
145 if (
plQtItemDelegate* pDelegate = qobject_cast<plQtItemDelegate*>(this->itemDelegateForIndex(m_Hovered)))
147 QStyleOptionViewItem option;
148 this->initViewItemOption(&option);
149 option.rect = this->visualRect(index);
150 option.state |= (index == this->currentIndex() ? QStyle::State_HasFocus : QStyle::State_None);
153 switch (pEvent->type())
155 case QEvent::HoverEnter:
156 case QEvent::HoverMove:
157 case QEvent::HoverLeave:
158 bRes = pDelegate->mouseHoverEvent(
static_cast<QHoverEvent*
>(pEvent), option, index);
160 case QEvent::MouseButtonPress:
161 bRes = pDelegate->mousePressEvent(
static_cast<QMouseEvent*
>(pEvent), option, index);
163 case QEvent::MouseButtonRelease:
164 bRes = pDelegate->mouseReleaseEvent(
static_cast<QMouseEvent*
>(pEvent), option, index);
166 case QEvent::MouseButtonDblClick:
167 bRes = pDelegate->mouseDoubleClickEvent(
static_cast<QMouseEvent*
>(pEvent), option, index);
169 case QEvent::MouseMove:
170 bRes = pDelegate->mouseMoveEvent(
static_cast<QMouseEvent*
>(pEvent), option, index);
184 QPersistentModelIndex m_Hovered;
185 QPersistentModelIndex m_Focused;