尝试从旋转框中删除Qt::WheelFocus'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 );
}
为了完整起见,来自 Grant Limberg 的编辑,因为这让我完成了 90% 的工作:
除了上面mmutz所说的,我还需要做一些其他的事情。我必须创建一个 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);
}