我在 QScrollArea 中有一个带有几个 QSpinBox 对象的控件。在滚动区域中滚动时一切正常,除非鼠标恰好位于其中一个 QSpinBoxes 上。然后 QSpinBox 窃取焦点,并且滚轮事件操纵旋转框值而不是滚动滚动区域。
我不想完全禁用使用鼠标滚轮来操作 QSpinBox,但我只希望它在用户明确单击或进入 QSpinBox 时发生。有没有办法防止 QSpinBox 从 QScrollArea 窃取焦点?
正如在下面对答案的评论中所说,设置 Qt::StrongFocus 确实会阻止焦点矩形出现在控件上,但是它仍然会窃取鼠标滚轮并调整旋转框中的值并阻止 QScrollArea 滚动。与 Qt::ClickFocus 相同。
原文由 Grant Limberg 发布,翻译遵循 CC BY-SA 4.0 许可协议
尝试从旋转框中删除
Qt::WheelFocus
‘QWidget::focusPolicy
:此外,您需要防止轮事件到达旋转框。您可以使用事件过滤器来做到这一点:
为了完整起见,格兰特林伯格进行了编辑,因为这让我完成了 90% 的工作:
除了上面 mmutz 所说的,我还需要做一些其他的事情。我必须创建一个 QSpinBox 的子类并实现
focusInEvent(QFocusEvent*)
和focusOutEvent(QFocusEvent*)
。 Basically, on afocusInEvent
, I change the Focus Policy toQt::WheelFocus
and on thefocusOutEvent
I change it back toQt::StrongFocus
.此外,事件过滤器类中的 eventFilter 方法实现会根据 spinbox 子类的当前焦点策略更改其行为: