我有一个具有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_())
答案 0 :(得分:1)
以下代码有效:
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
作为孩子,并且即使没有兄弟姐妹,也要把东西放到布局中。
答案 1 :(得分:0)
keyPressEvent对焦点政策很敏感。在您的示例中,事件将转到QMainWindow(如果您将keyPressEvent移动到那里,它确实会收到关键事件)。
是否有理由在窗口中设置对话框?如果以通常的方式启动对话框,使用child.show(),child.exec_()而不是setCentralWidget,它将显示在一个单独的窗口中并捕获键事件。