У меня есть простой пример диалогового окна с методом keyPressEvent
. Однако, независимо от того, что набрано, когда в подлоговом окне есть фокус, событие не запускается.
import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
import PyQt4.Qt
class KpeWindow(QDialog):
def __init__(self, parent=None):
super().__init__(parent)
main = QVBoxLayout(self)
label = QLabel(self)
label.setText('Test the keyPressEvent')
self.adjustSize()
self.setLayout(main)
def keyPressEvent(self, event):
QMessageBox.warning(self, 'MDI', 'keyPressEvent')
super().keyPressEvent(event)
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle('KeyPressEvent Test')
child = KpeWindow()
self.setCentralWidget(child)
if __name__ == '__main__':
app = QApplication(sys.argv)
mainWin = MainWindow()
mainWin.show()
sys.exit(app.exec_())
Следующий код работает:
class KpeWindow(QWidget):
def __init__(self, parent=None):
QWidget.__init__(self,parent)
main = QVBoxLayout(self)
label = QLabel(self)
label.setText('Test the keyPressEvent')
main.addWidget(label)
self.adjustSize()
self.setLayout(main)
def keyPressEvent(self, event):
QMessageBox.warning(self, 'MDI', 'keyPressEvent')
self.parent().keyPressEvent(event)
class MainWindow(QMainWindow):
def __init__(self):
QMainWindow.__init__(self)
self.setWindowTitle('KeyPressEvent Test')
main = QVBoxLayout(self)
child = KpeWindow(self)
child.setFocusPolicy(Qt.StrongFocus)
self.setFocusProxy(child)
main.addWidget(child)
child.setFocus(True)
self.adjustSize()
self.setLayout(main)
Я не уверен, какие из моих изменений работают, я подозреваю setFocusProxy
. В общем, я бы рекомендовал использовать QWidget
как ребенок и помещать вещи в макеты, даже если нет братьев и сестер.
KeyPressEvent чувствителен к политике фокуса. В вашем примере событие отправляется в QMainWindow (если вы переместите keyPressEvent туда, он получит ключевые события).
Есть ли причина иметь диалог внутри окна? Если вы запускаете диалог обычным способом, используя child.show(), child.exec_() вместо setCentralWidget, он отображается в отдельном окне и фиксирует ключевое событие.