Вы делаете ошибку, аналогичную той, о которой я вас предупреждал в этом ответе :
не устанавливайте атрибуты экземпляра, если они не требуются: все эти .rowPosition, self.monthList, et c, изменяются каждый раз в течение l oop циклов
Каждый раз, когда вы делаете это:
self.combo = QtWidgets.QComboBox()
вы перезаписываете атрибут combo
экземпляра (self
); это означает, что последним комбо, назначенным этому атрибуту, будет то, к чему относится self.combo
, и поэтому оно работает только для последней комбо.
То, что вы делаете, практически таково:
self.combo = QtWidgets.QComboBox()
self.combo = QtWidgets.QComboBox()
self.combo = QtWidgets.QComboBox()
self.combo = QtWidgets.QComboBox()
# ...
Подумайте об этом: на что будет ссылаться комбо self.combo
? Очевидно, последний.
В таких простых случаях, как ваш, для которых вы добавляете только ограниченный набор виджетов в фильтр событий, может быть достаточно использования isinstance()
:
def eventFilter(self, source, event):
if (event.type() == QtCore.QEvent.Wheel and
isinstance(source, QtWidgets.QComboBox)):
return True
return super(democode, self).eventFilter(source, event)
Но это также будет означать, что фильтр будет соответствовать любому QCombobox, для которого вы установили фильтр событий. Если по какой-либо другой причине вам нужно установить фильтр на другое комбо, которое не входит в эту таблицу, событие колеса не будет получено и этим комбо.
Самый простой и, вероятно, правильный способ сделать это, чтобы добавить эти комбо в список, и проверить в фильтре, является ли источник членом этого списка:
class democode(QtWidgets.QMainWindow, Ui_MainWindow):
def __init__(self):
super(democode, self).__init__()
self.setupUi(self)
<b>self.noWheelCombos = []</b>
for row in range(0,4):
for column in range(0,3):
if column == 1:
# note that I'm *NOT* using "self"
<b>combo = QtWidgets.QComboBox()
self.noWheelCombos.append(combo)</b>
combo.addItem("Male")
combo.addItem("Female")
combo.installEventFilter(self)
self.tableWidget.setCellWidget(row, column, <b>combo</b>)
# ...
def eventFilter(self, source, event):
if (event.type() == QtCore.QEvent.Wheel and
source in self.noWheelCombos):
return True
return super(democode, self).eventFilter(source, event)
Другая возможность - переопределить wheelEvent
функцией, которая ничего не делает , Это почти то же самое, что создание подкласса и перезапись метода wheelEvent
простым pass
; это может быть не очень элегантно, но отлично работает для очень простых ситуаций , например:
combo = QtWidgets.QComboBox()
combo.wheelEvent = lambda event: None
Наконец, небольшое предложение: если у вас всегда одни и те же элементы для нескольких комбинаций, Вы можете создать список вне цикла for и использовать addItems()
вместо добавления отдельных элементов каждый раз:
items = "Male", "Female"
for row in range(0,4):
for column in range(0,3):
if column == 1:
combo = QtWidgets.QComboBox()
combo.addItems(items)
# ...