Если я сделаю this->setFocusPolicy(Qt::WheelFocus);
тогда, если бы я был колесиком мыши над виджетом, он бы получил фокус. Если бы я должен был сделать this->setFocusPolicy(Qt::ClickFocus);
но затем колесо мыши приводит к потере фокуса, даже если указатель находится в том же виджете. Итак, как мне сфокусироваться на клике, но держать его на колесе мыши?
При дальнейшем исследовании: mouseWheelEvent всегда обрабатывается после событий фокуса. Поэтому попытка установить переменную, чтобы запомнить, происходит ли это из-за колесика мыши, не работает. Кроме того, причина, указанная в FocusReason, — мышь в случае колеса или щелчка, так что это тоже не помогает.
This enum type defines the various policies a widget can have with respect to acquiring keyboard focus.
Constant Value Description
Qt::TabFocus 0x1 the widget accepts focus by tabbing.
Qt::ClickFocus 0x2 the widget accepts focus by clicking.
Qt::StrongFocus TabFocus |
ClickFocus |
0x8 the widget accepts focus by both tabbing and clicking. On Mac OS X this will also be indicate that the widget accepts tab focus when in 'Text/List focus mode'.
Qt::WheelFocus StrongFocus |
0x4 like Qt::StrongFocus plus the widget accepts focus by using the mouse wheel.
Qt::NoFocus 0 the widget does not accept focus.
Qt::WheelFocus
изготовлена из StrongFocus
который состоит из ClickFocus
, поэтому вы должны просто установить WheelFocus, чтобы получить все предыдущие.
Следующее делает трюк:
Foo::Foo(){
this->setFocusPolicy(Qt::WheelFocus);
}
void Foo::focusInEvent( QFocusEvent *event ){
if (!(QApplication::mouseButtons() & Qt::LeftButton)){
this->clearFocus();
}
}