2016-02-14 3 views
0

enter image description hereКак Contol KeyEvent в Qt

С окном, объявленной CustomWidget как супер класс: class App(CustomWidget) ударяя Alt + Должным печатает 'keyPressEvent: Alt + A' сообщение.

Но функциональность KeyEvent не работает, когда CustomWidget назначается окну с помощью setCentralWidget() или устанавливается с помощью layer.addWidget (widget). Что отсутствует в коде?

from PyQt4 import QtCore, QtGui 

class CustomWidget(QtGui.QWidget): 
    def __init__(self, parent): 
     QtGui.QWidget.__init__(self, parent=parent) 

    def keyPressEvent(self, event): 
     if event.modifiers() == QtCore.Qt.AltModifier: 
      if event.key() == QtCore.Qt.Key_A: 
       print 'keyPressEvent: Alt + a' 
     # super(CustomWidget, self).keyPressEvent(event) 

class App(QtGui.QMainWindow): 
    def __init__(self, parent=None): 
     QtGui.QMainWindow.__init__(self, parent=parent) 
     centralWidget = CustomWidget(self) 

     self.setCentralWidget(centralWidget) 

     mainLayout=QtGui.QVBoxLayout() 
     centralWidget.setLayout(mainLayout) 

     widget = CustomWidget(self) 
     mainLayout.addWidget(widget) 

if __name__ == "__main__": 
    app = QtGui.QApplication(sys.argv) 
    w = App() 
    w.show() 
    sys.exit(app.exec_()) 

ответ

1

Виджет должен иметь фокус для получения события. Убедитесь, что вы вызываете setFocusPolicy(), чтобы CustomWidget принимал и поддерживал фокус после создания окна.

QWidget, keyPressEvent

QWidget, setFocusPolicy

+0

Спасибо! Я разместил его как решение! – alphanumeric

0

Рабочий раствор:

Важно: В конце метода() Groupbox»keyPressEvent мы должны передать событие до супер. Или событие не будут распространяться на родительский виджет: super(QtGui.QGroupBox, self).keyPressEvent(event)

enter image description here

import sys 
from PyQt4 import QtCore, QtGui 

class MainWindow(QtGui.QMainWindow): 
    def __init__(self, parent): 
     QtGui.QMainWindow.__init__(self, parent=parent) 
     self.setFocusPolicy(QtCore.Qt.StrongFocus) 

    def keyPressEvent(self, event): 
     if event.modifiers() == QtCore.Qt.ControlModifier: 
      if event.key() == QtCore.Qt.Key_T: 
       print 'MainWindow: Control + t' 
      if event.key() == QtCore.Qt.Key_M: 
       print 'MainWindow: Control + m' 

class GroupBox(QtGui.QGroupBox): 
    def __init__(self, parent=None): 
     QtGui.QGroupBox.__init__(self, parent=parent) 
     self.setFocusPolicy(QtCore.Qt.StrongFocus) 

    def keyPressEvent(self, event): 
     if event.modifiers() == QtCore.Qt.ControlModifier: 
      if event.key() == QtCore.Qt.Key_T: 
       print 'GroupBox: Control + t' 
      if event.key() == QtCore.Qt.Key_S: 
       print 'GroupBox: Control + s' 
     super(QtGui.QGroupBox, self).keyPressEvent(event) 

class App(MainWindow): 
    def __init__(self, parent=None): 
     MainWindow.__init__(self, parent=parent) 
     centralWidget = QtGui.QWidget(self) 

     self.setCentralWidget(centralWidget) 

     mainLayout=QtGui.QVBoxLayout() 
     centralWidget.setLayout(mainLayout) 

     groupBox = GroupBox(self) 
     mainLayout.addWidget(groupBox) 

if __name__ == "__main__": 
    app = QtGui.QApplication(sys.argv) 
    w = App() 
    w.show() 
    sys.exit(app.exec_()) 
Смежные вопросы