在 QSpinBox 中禁用滚轮

Posted

技术标签:

【中文标题】在 QSpinBox 中禁用滚轮【英文标题】:disable wheel in QSpinBox 【发布时间】:2018-09-17 14:42:18 【问题描述】:

我的 PySide 项目中有许多旋转框,我想更改其行为,因此用户需要单击字段以更改值,然后按 Enter 键。我想禁用旋转框的滚轮行为。我试过设置焦点策略,但没有生效。

    def light_label_event(self,text,checked):
        print("this is the pressed button's label", text)

    def populate_lights(self):
        for light in self.lights:
            light_label = QtWidgets.QSpinBox()
            light_label.setFocusPolicy(QtCore.Qt.StrongFocus)

【问题讨论】:

【参考方案1】:

你必须创建一个自定义 SpinBox 并覆盖 wheelEvent 方法:

from PySide2 import QtWidgets


class SpinBox(QtWidgets.QSpinBox):
    def wheelEvent(self, event):
        event.ignore()

if __name__ == '__main__':
    import sys

    app = QtWidgets.QApplication(sys.argv)
    w = SpinBox()
    w.show()
    sys.exit(app.exec_())

【讨论】:

【参考方案2】:

您也可以只覆盖现有小部件的 mouseEvent。例如,如果您想忽略特定旋转框中的滚动事件,您可以使用不执行任何操作的 lambda 函数覆盖 wheelEvent:

from PyQt5 import QtWidgets

box = QtWidgets.QSpinBox()
box.wheelEvent = lambda event: None

或者,您可以使用 findChildren 函数更改主窗口包含的特定类型(例如 QSpinBox)的所有小部件的事件,如下所示:

from PyQt5 import QtCore, QtWidgets

main = QtWidgets.QMainWindow()

'''add some QSpinboxes to main'''

opts = QtCore.Qt.FindChildrenRecursively
spinboxes = main.findChildren(QtWidgets.QSpinBox, options=opts)
for box in spinboxes:
    box.wheelEvent = lambda *event: None

理论上,同样的原理可以应用于其他小部件类和事件,但除了旋转框和滚轮事件之外,我还没有对其进行测试。

【讨论】:

谢谢,非常有用的回答【参考方案3】:

也可以将IgnoreWheelEvent 类实现为EventFilter。 这个类必须实现eventFilter(QObject, QEvent)。那你就可以spinBox.installEventFilter(IngoreWheelEvent)了。

我最近在 C++ 中实现了这一点。因为我不想发布可能是错误的 python 代码,所以这是我的 C++ 实现来了解一下。我已经在这里的构造函数中做了installEventFilter,这在实现中为我节省了一行。

class IgnoreWheelEventFilter : public QObject

    Q_OBJECT
public:
    IgnoreWheelEventFilter(QObject *parent) : QObject(parent) parent->installEventFilter(this);
protected:
    bool eventFilter(QObject *watched, QEvent *event) override

    if (event->type() == QEvent::Wheel)
    
        // Ignore the event
        return true;
    
    return QObject::eventFilter(watched, event);

;

//And later in the implementation...
IgnoreWheelEventFilter *ignoreFilter = new IgnoreWheelEventFilter(ui->spinBox);
// And if not done in the constructor:
// ui->spinBox->installEventFilter(ignoreFilter);

【讨论】:

以上是关于在 QSpinBox 中禁用滚轮的主要内容,如果未能解决你的问题,请参考以下文章

如何实时取得QSpinBox的值

PyQt5 - 让 QSpinBox 缩小,以便 QSlider 可以在 QHBoxLayout 中扩展? [复制]

箭头按钮的 QSpinBox 信号

PyQt5组件之QSpinBox

valueChanged(const Qstring &) 为空时不会在 qspinbox 中触发

定制QSpinBox外观