Python 禁用QSpinBox中的控制盘

Python 禁用QSpinBox中的控制盘,python,pyside2,Python,Pyside2,我的PySide项目中有许多Spinbox,我希望更改其行为,以便so用户需要在字段中单击以更改值,然后按enter键。我想禁用Spinbox的滚轮行为。我曾尝试制定聚焦政策,但没有效果 def light_label_event(self,text,checked): print("this is the pressed button's label", text) def populate_lights(self): for light in

我的PySide项目中有许多Spinbox,我希望更改其行为,以便so用户需要在字段中单击以更改值,然后按enter键。我想禁用Spinbox的滚轮行为。我曾尝试制定聚焦政策,但没有效果

    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)

您必须创建自定义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_())

您必须创建自定义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_())

您还可以覆盖现有小部件的mouseEvent。例如,如果要忽略特定spinbox中的滚动事件,可以使用不执行任何操作的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

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

您也可以覆盖现有小部件的mouseEvent。例如,如果要忽略特定spinbox中的滚动事件,可以使用不执行任何操作的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

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

也可以将
IgnoreWheelEvent
类实现为EventFilter。 此类必须实现
eventFilter(QObject,QEvent)
。然后可以执行
spinBox.installEventFilter(IngoreWheelEvent)

我最近在C++中实现的。因为我不想发布Python代码,可能是错误的,下面是我的C++实现来获得一个想法。我已经在这里的构造函数中安装了

installEventFilter
,这在实现中为我节省了一行代码

类IgnoreWheelEventFilter:公共QObject
{
Q_对象
公众:
IgnoreWheelEventFilter(QObject*parent):QObject(parent){parent->installEventFilter(this);}
受保护的:
布尔事件过滤器(QObject*监视,QEvent*事件)覆盖
{
如果(事件->类型()==QEvent::Wheel)
{
//忽略事件
返回true;
}
返回QObject::eventFilter(监视的,事件);
}
};
//在后来的实施中。。。
IgnoreWheelEventFilter*ignoreFilter=新建IgnoreWheelEventFilter(ui->spinBox);
//如果未在构造函数中完成:
//ui->spinBox->installEventFilter(ignoreFilter);

还可以将
IgnoreWheelEvent
类实现为EventFilter。 此类必须实现
eventFilter(QObject,QEvent)
。然后可以执行
spinBox.installEventFilter(IngoreWheelEvent)

我最近在C++中实现的。因为我不想发布Python代码,可能是错误的,下面是我的C++实现来获得一个想法。我已经在这里的构造函数中安装了

installEventFilter
,这在实现中为我节省了一行代码

类IgnoreWheelEventFilter:公共QObject
{
Q_对象
公众:
IgnoreWheelEventFilter(QObject*parent):QObject(parent){parent->installEventFilter(this);}
受保护的:
布尔事件过滤器(QObject*监视,QEvent*事件)覆盖
{
如果(事件->类型()==QEvent::Wheel)
{
//忽略事件
返回true;
}
返回QObject::eventFilter(监视的,事件);
}
};
//在后来的实施中。。。
IgnoreWheelEventFilter*ignoreFilter=新建IgnoreWheelEventFilter(ui->spinBox);
//如果未在构造函数中完成:
//ui->spinBox->installEventFilter(ignoreFilter);

谢谢,非常有用的回答谢谢,非常有用的回答