Я понимаю, что QEvent::ShortcutOverride
происходит, когда в родительском списке есть ярлык, и ребенок хочет «идти против правила». Пример, приведенный на Qt Wiki, относится к медиаплееру, который останавливается с помощью Space, но QLineEdit
может захотеть использовать Space, что имеет большой смысл.Qt ShortcutOverride действие по умолчанию
Кроме того, если событие принято, то дочерний виджет генерирует QEvent::KeyPress
, чтобы вы могли обработать ваш конкретный случай.
Теперь, мой вопрос: почему кажется, что действие по умолчанию на самом деле принимаетQEvent::ShortcutOverride
, когда используется стандартный ярлык? Это кажется мне противоположным тому, что предлагает название, т. Е. По умолчанию оно переопределено, и вам нужно обработать событие, чтобы передать ярлык.
В приведенном ниже коде, если вы не устанавливаете фильтр событий, вы не видите сообщение.
from PySide.QtGui import QApplication
from PySide import QtGui, QtCore
app = QApplication([])
class Test(QtGui.QWidget):
def __init__(self, parent=None):
super(Test, self).__init__(parent)
self.setLayout(QtGui.QVBoxLayout())
self.w_edit = QtGui.QLineEdit(parent=self)
self.layout().addWidget(self.w_edit)
# If we install the event filter and ignore() the ShortcutOverride
# then the shortcut works
self.w_edit.installEventFilter(self)
# Ctrl+Left is already in use (jump to previous word)
shortcut = QtGui.QShortcut(QtGui.QKeySequence('Ctrl+Left'), self)
shortcut.setContext(QtCore.Qt.ApplicationShortcut)
shortcut.activated.connect(self.test_slot)
def test_slot(self):
print('ctrl+left pressed!')
def eventFilter(self, obj, event):
if obj is self.w_edit and event.type() == QtCore.QEvent.ShortcutOverride:
# Send the event up the hierarchy
event.ignore()
# Stop obj from treating the event itself
return True
# Events which don't concern us get forwarded
return super(Test, self).eventFilter(obj, event)
widget = Test()
widget.show()
if __name__ == '__main__':
app.exec_()
Мой фактический сценарий является вкладка виджет, который я хочу использовать Ctrl + Left/Right для переключения вкладок, которая работает, если что-то вроде QLineEdit
не имеет фокус. Я чувствую, что должен быть лучший способ, кроме вызова event->ignore(); return true
на всех QLineEdit
и любых других виджетах, которые могли бы использовать комбинацию клавиш, я что-то упустил здесь?
Спасибо!
Спасибо, что делает много смысла! По какой-то причине я думал, что способ добиться этого - перегрузить 'notify()' для QApplication, но это довольно аккуратно:]. –