keyPressEvent не работает, как это исправить?

#pyqt4 #keypress

#pyqt4 #нажатие клавиши

Вопрос:

Я пытаюсь заставить keypressevent работать с помощью следующего кода

 import sys,
from PyQt4 import QtCore, QtGui

class Ui_MainWindow(QtGui.QWidget):
    def __init__(self):
        super(Ui_MainWindow, self).__init__()


    def keyPressEvent(self, event):
        print 'a'

    def setupUi(self, MainWindow):
        MainWindow.setObjectName(("MainWindow"))
        MainWindow.resize(371, 345)
        MainWindow.setMaximumSize(QtCore.QSize(401, 600))
        MainWindow.setWindowIcon(QtGui.QIcon('icons/icon.png'))
        screen = QtGui.QDesktopWidget().screenGeometry()
        mysize = MainWindow.geometry()
        hpos = ( screen.width() - mysize.width() ) / 2
        vpos = ( screen.height() - mysize.height() ) / 2
        MainWindow.move(hpos, vpos)
        #some GUI
        MainWindow.setCentralWidget(self.centralwidget)
        cd=MainWindow.centralWidget()
        cd.setFocusPolicy(QtCore.Qt.StrongFocus)
        cd.setFocus()
        self.actionHardware = QtGui.QAction(MainWindow)
        self.actionHardware.setObjectName(("actionHardware"))
        self.retranslateUi(MainWindow)


        #COnnect odes


    def retranslateUi(self, MainWindow):
        #sime button text codes

if __name__=="__main__" :
    app = QtGui.QApplication(sys.argv)
    MainWindow = QtGui.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())
  

Код был частично сгенерирован с помощью QtDesigner. Я заметил, что замена Mainwindow.show () на ui.show() включает keypressevent, но за счет того, что я не показываю никаких кнопок, которые я создаю в центральном виджете Mainwindow

Комментарии:

1. Ваш код работает для меня до тех пор, пока я меняю строку MainWindow.setCentralWidget(self.centralwidget) на MainWindow.setCentralWidget(self) .

2. это приведет к тому, что все кнопки, которые я добавил в self.centralwidget, будут скрыты

3. У вашего Ui_MainWindow нет атрибута centralwidget, поэтому ваш написанный код выдает AttributeError . Я думаю, что это помогло бы реорганизовать ваш код, чтобы установочный код MainWindow находился за пределами вашего Ui_MainWindow класса. Ui_MainWindow является дочерним виджетом MainWindow . На самом деле это не соответствует объектно-ориентированным рекомендациям по использованию установочного кода MainWindow. То, как вы написали, все равно будет работать, но мне интересно, не в этом ли причина путаницы.

Ответ №1:

Похоже, проблема в том, как вы повторно используете код, выводимый дизайнером. Вы определили Ui_MainWindow.keyPressEvent и создали экземпляр «ui» класса. Однако: «пользовательский интерфейс» нигде напрямую не включается в графический интерфейс (ui.setupUi добавляет другие виджеты, но не сам, в MainWindow), и, таким образом, события никогда не доставляются в пользовательский интерфейс.

Мой подход был бы больше похож на этот:

 class Ui_MainWindow(object):  ## note this does not need to inherit QWidget
    ...                       ## and ideally, this code should not be changed
    ...                       ## after designer generates it
    ...

class Window(QtGui.QMainWindow):
    def __init__(self):
        super(Window, self).__init__()
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

    def keyPressEvent(self, ev):
        print "key press"

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