#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_())