2013-08-24 92 views
0

我在ui中使用pyQt Designer創建了一個代碼並將其更改爲py代碼。在由pyQT設計器生成的代碼中生成keyPressEvent

現在我想一些按鍵事件添加到我這也就是說,如果我上的數字3的鍵盤鍵點擊,我的標籤應該有文字3就可以了,或者它只是打印「嗨」

我已經檢查在互聯網上的很多論壇,並發現它最好重新實現keyPressEvent來使用鍵盤事件。我試過,但不知何故,我無法使它在由pyQT設計器生成的代碼中工作。

下面是由pyQT設計師生成的代碼。我已經把keyPressEvent的代碼,將其重新實施爲好,但它dosent工作:

try: 
    _encoding = QtGui.QApplication.UnicodeUTF8 
    def _translate(context, text, disambig): 
     return QtGui.QApplication.translate(context, text, disambig, _encoding) 
except AttributeError: 
    def _translate(context, text, disambig): 
     return QtGui.QApplication.translate(context, text, disambig) 

class Ui_MainWindow(object): 
    def setupUi(self, MainWindow): 


     MainWindow.setObjectName(_fromUtf8("MainWindow")) 
     MainWindow.resize(800, 600) 

     MainWindow.setFocus() 

     def keyPressEvent(self, qKeyEvent): 
      print "hi" 
      print(qKeyEvent.key()) 
      if qKeyEvent.key() == QtCore.Qt.Key_Return: 
       print('Enter pressed') 
      else: 
       super(Ui_MainWindow).keyPressEvent(qKeyEvent) 

     self.centralwidget = QtGui.QWidget(MainWindow) 
     self.centralwidget.setObjectName(_fromUtf8("centralwidget")) 
     self.horizontalLayoutWidget = QtGui.QWidget(self.centralwidget) 
     self.horizontalLayoutWidget.setGeometry(QtCore.QRect(40, 10, 721, 80)) 
     self.horizontalLayoutWidget.setObjectName(_fromUtf8("horizontalLayoutWidget")) 
     self.horizontalLayout = QtGui.QHBoxLayout(self.horizontalLayoutWidget) 
     self.horizontalLayout.setMargin(0) 
     self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout")) 
     self.textEdit = QtGui.QLabel(self.centralwidget) 
     self.textEdit.setGeometry(QtCore.QRect(50, 110, 81, 41)) 
     self.textEdit.setObjectName(_fromUtf8("textEdit")) 

     self.pushButton = QtGui.QPushButton(self.centralwidget) 
     self.pushButton.setGeometry(QtCore.QRect(130, 260, 75, 23)) 
     self.pushButton.setObjectName(_fromUtf8("pushButton")) 
     MainWindow.setCentralWidget(self.centralwidget) 
     self.menubar = QtGui.QMenuBar(MainWindow) 
     self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 21)) 
     self.menubar.setObjectName(_fromUtf8("menubar")) 
     MainWindow.setMenuBar(self.menubar) 
     self.statusbar = QtGui.QStatusBar(MainWindow) 
     self.statusbar.setObjectName(_fromUtf8("statusbar")) 
     MainWindow.setStatusBar(self.statusbar) 

     self.retranslateUi(MainWindow) 
     QtCore.QMetaObject.connectSlotsByName(MainWindow) 

    def retranslateUi(self, MainWindow): 
     MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow", None)) 
     self.textEdit.setText("I am a label") 
     self.pushButton.setText(_translate("MainWindow", "PushButton", None)) 


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

我是新來這個論壇,這將是有益的,如果有人可以提供幫助。我知道這可以通過創建另一個繼承QMainWindow的類來實現,但我想在相同的代碼中執行此操作,即在由pyQT Designer生成的代碼塊中。

也請建議如果有任何的方式來做到這一點沒有重新實現keypressEvent

感謝

回答

4

有兩個原因,爲什麼您的代碼不起作用。

第一個是你在setupUi方法中定義keyPressEvent,因此它對班級完全不可見。

其次,因爲在代碼:

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

你正在創建的QMainWindow一個實例,使用它自己的執行keyPressEvent。你應該創建一個QMainWindow的子類並在那裏重新實現該方法。


如何正確地做到這一點。

  • 打開設計器並創建主窗口。 enter image description here

  • 編譯.ui文件中使用pyuic

    $pyuic4 mainwindow.ui -o ui_mainwindow.py 
    
  • 創建一個新文件在那裏你會寫QMainWindowmymainwindow.py的子類。 不要修改ui_mainwindow.py。在文件開頭有一個很大的警告:

    #警告!此文件中所做的所有更改都將丟失!

    如果你不想改變UI時失去所有的代碼,然後做修改文件。

  • 實現在子類中的keyPressEvent


from PyQt4 import QtGui 

# import the UI from the generated file 
from ui_mainwindow import Ui_MainWindow 


# it's not stricly necessary to subclass Ui_MainWindow. 
class MyMainWindow(QtGui.QMainWindow, Ui_MainWindow): 
    def __init__(self, parent=None): 
     super(MyMainWindow, self).__init__(parent) 
     self.setupUi(self) 
     # if you didn't subclass Ui_MainWindow simply do: 
     # Ui_MainWindow().setupUi(self) 

    def keyPressEvent(self, event): 
     # implement the method here 
     self.label.setText(self.label.text() + 'a') 

if __name__ == '__main__': 
    app = QtGui.QApplication([]) 
    win = MyMainWindow() 
    win.show() 
    app.exec_() 
  • 最後運行代碼並注意您按一個鍵,a被添加到文本每一次。
+0

不,我試着把keyPressEvent放在其他方法之外,但沒有效果。 –

+0

@paarthbatra我已經更新了我的答案。 – Bakuriu

+0

我確實嘗試了你的代碼,但它仍然不起作用,但只顯示空的新行,如果按下輸入,請告訴我我真的很需要它 – haidarvm