Python 禁用QSpinBox中的控制盘
我的PySide项目中有许多Spinbox,我希望更改其行为,以便so用户需要在字段中单击以更改值,然后按enter键。我想禁用Spinbox的滚轮行为。我曾尝试制定聚焦政策,但没有效果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
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);
谢谢,非常有用的回答谢谢,非常有用的回答