【问题标题】:Generating keyPressEvent in a code generated by pyQT Designer在 pyQT Designer 生成的代码中生成 keyPressEvent
【发布时间】:2014-05-19 04:46:48
【问题描述】:

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

现在我想在我的 this 中添加一些 Keypress 事件,也就是说,如果我点击带有数字 3 的键盘键,我的标签上应该有文本 3 或者它只是打印“Hi”

我已经在互联网上检查了很多论坛,发现最好重新实现 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 的情况下做到这一点

谢谢

【问题讨论】:

    标签: python pyqt


    【解决方案1】:

    您的代码无法运行的原因有两个。

    首先是您在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 的子类并在那里重新实现该方法。


    如何正确地做到这一点。

    • 打开设计器并创建您的主窗口。

    • 使用pyuic编译.ui文件:

      $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

    【讨论】:

    • 不,我也尝试将 keyPressEvent 放在其他方法之外,但没有效果。
    • 我确实尝试了你的代码,但它仍然无法正常工作,但如果按 Enter 只会显示空的新行,请告诉我我真的需要它
    • @coder5 我已按照答案中描述的步骤进行操作,并且看到了预期的输出:每次您按下键盘上的一个键并将焦点放在窗口上时,都会在文本中附加一个a。如果您遇到问题,您应该首先检查您是否完全按照描述的方式进行操作,最后您应该提出一个新问题。
    猜你喜欢
    • 1970-01-01
    • 2013-04-23
    • 1970-01-01
    • 2011-10-18
    • 2013-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-03
    相关资源
    最近更新 更多