PyQt keyPressEvent не запускается из QDialog

Вопрос:

У меня есть простой пример диалогового окна с методом 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 как ребенок и помещать вещи в макеты, даже если нет братьев и сестер.

Ответ №1

KeyPressEvent чувствителен к политике фокуса. В вашем примере событие отправляется в QMainWindow (если вы переместите keyPressEvent туда, он получит ключевые события).

Есть ли причина иметь диалог внутри окна? Если вы запускаете диалог обычным способом, используя child.show(), child.exec_() вместо setCentralWidget, он отображается в отдельном окне и фиксирует ключевое событие.

Оцените статью
TechArks.Ru
Добавить комментарий