2011-06-11 90 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_())