2011-06-11 88 views
1

我试图让keypressevent工作,下面的代码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的代码被部分产生。我注意到,通过ui.show()代替Mainwindow.show()使keypressevent但没有表现出任何按钮的成本我在主窗口中央物件

+0

您的代码对我的作品作为我改线'MainWindow.setCentralWidget(self.centralwidget)''来MainWindow.setCentralWidget(个体经营)' 。 – 2011-06-11 11:03:39

+0

这会导致我在self.centralwidget中添加的所有按钮被隐藏 – Arvindsa 2011-06-11 12:26:10

+0

您的'Ui_MainWindow'没有centralwidget属性,所以您写的代码给出了一个'AttributeError'。我在想这会帮助重构你的代码,以便MainWindow设置代码在你的'Ui_MainWindow'类之外。 'Ui_MainWindow'是'MainWindow'的子部件。它并不真正符合MainWindow的设置代码的面向对象的最佳实践。你写的方式仍然有效,但我想知道这是不是混淆的根源。 – 2011-06-11 13:04:47

回答

1

看起来问题出在你重新的方式创建使用Designer输出的代码。您定义了Ui_MainWindow.keyPressEvent,并创建了该类的实例“ui”。但是:“ui”永远不会直接合并到GUI的任何位置(ui.setupUi会将其他小部件添加到MainWindow中,但不会将其自身添加到MainWindow中),因此事件不会传递给ui。

我的方法看起来会是这样的:只要

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