尝试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% 的工作:
除了上面 mmutz 所说的,我还需要做一些其他的事情。我必须创建一个 QSpinBox 的子类并实现focusInEvent(QFocusEvent*)
和focusOutEvent(QFocusEvent*)
. 基本上,在 a 上focusInEvent
,我将 Focus Policy 更改为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);
}