PyQt keyPressEvent不是从QDialog触发的

时间:2014-07-15 12:16:20

标签: python-3.x pyqt4

我有一个具有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_())

2 个答案:

答案 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,它将显示在一个单独的窗口中并捕获键事件。