Ваш код:
def eventFilter(self, tableView, event):
if event.type() == QtCore.QEvent.KeyPress:
key = event.key()
if event.modifiers() in (QtCore.Qt.NoModifier, QtCore.Qt.KeypadModifier):
if key in (QtCore.Qt.Key_Enter, QtCore.Qt.Key_Return):
self.menu.editItem.trigger()
return True
Как я упоминал в комментарии к @interjay, может быть множество вызовов этой функции для любого вида события пользовательского интерфейса, и если у вас есть много таких фильтров, они могут создать медленный пользовательский интерфейс. Если вы хотите оптимизировать это хотя бы до первого теста if, то поместите локальное определение QtCore.QEvent.KeyPress
в значение аргумента по умолчанию:
def eventFilter(self, tableView, event,
FILTER_EVENT_TYPE=QtCore.QEvent.KeyPress
):
if event.type() == FILTER_EVENT_TYPE:
if event.modifiers() in (QtCore.Qt.NoModifier, QtCore.Qt.KeypadModifier):
key = event.key()
if key in (QtCore.Qt.Key_Enter, QtCore.Qt.Key_Return):
self.menu.editItem.trigger()
return True
(я также переместил вызов функции в event.key () в после теста на event.modifiers ().)
Аргументы по умолчанию, подобные этому, оцениваются один раз во время компиляции функции, когда модуль импортируется, а не один раз за вызов, поэтому поиск по QtCore.QEvent.KeyPress
будет ускоряться. Конечно, вы можете довести это до крайности:
def eventFilter(self, tableView, event,
FILTER_EVENT_TYPE=QtCore.QEvent.KeyPress
FILTER_MODIFIERS=(QtCore.Qt.NoModifier, QtCore.Qt.KeypadModifier),
FILTER_KEYS=(QtCore.Qt.Key_Enter, QtCore.Qt.Key_Return)
):
if (event.type() == FILTER_EVENT_TYPE and
event.modifiers() in FILTER_MODIFIERS and
event.key() in FILTER_KEYS):
self.menu.editItem.trigger()
return True
Теперь вы оптимизировали не только поиск модуля-объекта-атрибута, но и конструкции кортежей, и, как упоминает @AndrewDalke, мое тестирование in
показывает, что для кортежей это быстрее, чем устанавливает размер около 3 или 4 элемента. Одиночное условие будет по-прежнему замыкаться при сбое любой части условия, поэтому вы не будете получать вызовы event.modifiers или event.key, если тип не является нажатием клавиши.
РЕДАКТИРОВАТЬ: мне нравится совместное тестирование ключа и модификатора @ ekhumoro, вот как это будет выглядеть в моем коде:
def eventFilter(self, tableView, event,
FILTER_EVENT_TYPE=QtCore.QEvent.KeyPress
FILTER_KEY_MODIFIERS=((QtCore.Qt.Key_Return, QtCore.Qt.NoModifier),
(QtCore.Qt.Key_Enter, QtCore.Qt.KeypadModifier),
)
):
if (event.type() == FILTER_EVENT_TYPE and
(event.key(), event.modifiers()) in FILTER_KEY_MODIFIERS):
self.menu.editItem.trigger()
return True