在 QSpinBox 中禁用滚轮
disable wheel in QSpinBox
我的 PySide 项目中有许多旋转框,我想更改其行为,因此用户需要单击该字段以更改值,然后按回车键。我想禁用旋转框的滚轮行为。我试过设置焦点策略,但是没有生效。
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_())
您也可以只覆盖现有小部件的 mouseEvent。例如,如果您想忽略特定旋转框中的滚动事件,您可以使用不执行任何操作的 lambda 函数覆盖 wheelEvent:
from PyQt5 import QtWidgets
box = QtWidgets.QSpinBox()
box.wheelEvent = lambda event: None
或者,您可以使用 findChildren 函数来更改主 window 包含的所有特定类型的小部件(例如 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
同样的原则理论上可以应用于其他小部件 类 和事件,但我没有在旋转框和轮子事件之外对其进行测试。
也可以将 IgnoreWheelEvent
class 实现为 EventFilter。
这个 class 必须实现 eventFilter(QObject, QEvent)
。然后你可以做 spinBox.installEventFilter(IngoreWheelEvent)
.
我最近用 C++ 实现了它。因为我不想 post 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);
我的 PySide 项目中有许多旋转框,我想更改其行为,因此用户需要单击该字段以更改值,然后按回车键。我想禁用旋转框的滚轮行为。我试过设置焦点策略,但是没有生效。
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_())
您也可以只覆盖现有小部件的 mouseEvent。例如,如果您想忽略特定旋转框中的滚动事件,您可以使用不执行任何操作的 lambda 函数覆盖 wheelEvent:
from PyQt5 import QtWidgets
box = QtWidgets.QSpinBox()
box.wheelEvent = lambda event: None
或者,您可以使用 findChildren 函数来更改主 window 包含的所有特定类型的小部件(例如 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
同样的原则理论上可以应用于其他小部件 类 和事件,但我没有在旋转框和轮子事件之外对其进行测试。
也可以将 IgnoreWheelEvent
class 实现为 EventFilter。
这个 class 必须实现 eventFilter(QObject, QEvent)
。然后你可以做 spinBox.installEventFilter(IngoreWheelEvent)
.
我最近用 C++ 实现了它。因为我不想 post 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);