2015-01-14 5 views
3

Я понимаю, что 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 и любых других виджетах, которые могли бы использовать комбинацию клавиш, я что-то упустил здесь?

Спасибо!

ответ

2

Вы можете установить один фильтр событий на экземпляре приложения, а затем фильтровать соответственно:

 QtGui.qApp.installEventFilter(self) 
     # self.w_edit.installEventFilter(self) 
     ... 

    def eventFilter(self, source, event): 
     if event.type() == QtCore.QEvent.ShortcutOverride: 
      # filter by source object, source.parent(), or whatever... 
      if isinstance(source, QtGui.QLineEdit): 
       event.ignore() 
       return True 
     return super(Test, self).eventFilter(source, event) 
+0

Спасибо, что делает много смысла! По какой-то причине я думал, что способ добиться этого - перегрузить 'notify()' для QApplication, но это довольно аккуратно:]. –

Смежные вопросы