2013-08-24 95 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