Попробуйте удалить Qt::WheelFocus
из spinbox 'QWidget::focusPolicy
:
spin->setFocusPolicy( Qt::StrongFocus );
Кроме того, вам нужно предотвратить попадание события колеса в спин-боксы. Вы можете сделать это с помощью фильтра событий:
explicit Widget( QWidget * parent=0 )
: QWidget( parent )
{
// setup ...
Q_FOREACH( QSpinBox * sp, findChildren<QSpinBox*>() ) {
sp->installEventFilter( this );
sp->setFocusPolicy( Qt::StrongFocus );
}
}
/* reimp */ bool eventFilter( QObject * o, QEvent * e ) {
if ( e->type() == QEvent::Wheel &&
qobject_cast<QAbstractSpinBox*>( o ) )
{
e->ignore();
return true;
}
return QWidget::eventFilter( o, e );
}
отредактируйте от Гранта Лимберга для полноты, поскольку это дало мне 90% пути:
В дополнение к тому, что Ммуц сказал выше, мне нужно было сделать еще несколько вещей. Мне пришлось создать подкласс QSpinBox и реализовать focusInEvent(QFocusEvent*)
и focusOutEvent(QFocusEvent*)
. По сути, на focusInEvent
я изменяю политику фокусировки на Qt::WheelFocus
, а на focusOutEvent
я изменяю обратно на Qt::StrongFocus
.
void MySpinBox::focusInEvent(QFocusEvent*)
{
setFocusPolicy(Qt::WheelFocus);
}
void MySpinBox::focusOutEvent(QFocusEvent*)
{
setFocusPolicy(Qt::StrongFocus);
}
Кроме того, реализация метода eventFilter в классе фильтра событий меняет свое поведение в зависимости от текущей политики фокуса подкласса spinbox:
bool eventFilter(QObject *o, QEvent *e)
{
if(e->type() == QEvent::Wheel &&
qobject_cast<QAbstractSpinBox*>(o))
{
if(qobject_cast<QAbstractSpinBox*>(o)->focusPolicy() == Qt::WheelFocus)
{
e->accept();
return false;
}
else
{
e->ignore();
return true;
}
}
return QWidget::eventFilter(o, e);
}