在pyQT Designer生成的代码中生成keyPressEvent

时间:2013-08-24 10:09:46

标签: python pyqt

我在ui中使用pyQt Designer创建了一个代码,并将其更改为py代码。

现在我想在我的脑袋上添加一些Keypress事件,即如果我点击带有数字3的键盘键,我的标签上应该有文字3或者它只是打印“你好”

我已经通过互联网检查了很多论坛,发现最好重新实现keyPressEvent来使用键盘事件。我试过,但不知怎的,我无法在pyQT设计器生成的代码中使它工作。

下面是pyQT设计器生成的代码。我已经将keyPressEvent的代码重新实现在其中,但它起作用了:

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

,有任何方法可以做到这一点

由于

1 个答案:

答案 0 :(得分:4)

您的代码无效的原因有两个。

首先,您要在keyPressEvent方法中定义setupUi,因此它对类完全不可见。

其次是因为在代码中:

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 。文件开头有一个很大的警告:

      

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

    如果您不想在更改用户界面时丢失所有代码,请执行 修改文件。

  • 在子类中实现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都会添加到文本中。