【问题标题】:How to allow tab key pressing event in pyqt5如何在pyqt5中允许tab键按下事件
【发布时间】:2018-12-18 13:44:14
【问题描述】:

假设我有一个名为 button 的 QPushButton,我成功执行以下操作以允许 click 事件:

class UI(object):
    def setupUi(self, Dialog):
        # ...
        self.button.clicked.connect(self.do_something)

    def do_something(self):
        # Something here

我的问题是:当按下the tab 键时,我如何调用do_something()?例如,如果我有一个名为 tb_id 的 QlineEdit,在输入一个值并按 Tab 键后,do_something() 方法应该以与上述clicked 相同的方式调用。如何使用pyqt5 做到这一点?

非常感谢。

【问题讨论】:

    标签: python pyqt pyqt5


    【解决方案1】:

    为了得到你想要的,有很多方法,但在通过观察你的代码指向它之前,我看到你已经用 Qt Designer 生成了它,所以不应该修改代码,而是创建另一个使用该代码的类,所以我将放置基本代码:

    from PyQt5 import QtCore, QtWidgets
    
    class UI(object):
        def setupUi(self, Dialog):
            self.button = QtWidgets.QPushButton("Press Me")
            lay = QtWidgets.QVBoxLayout(Dialog)
            lay.addWidget(self.button)
    
    class Dialog(QtWidgets.QDialog, UI):
        def __init__(self, parent=None):
            super(Dialog, self).__init__(parent)
            self.setupUi(self)
            self.button.clicked.connect(self.do_something)
    
        @QtCore.pyqtSlot()
        def do_something(self):
            print("do_something")
    
    if __name__ == '__main__':
        import sys
        app = QtWidgets.QApplication(sys.argv)
        w = Dialog()
        w.resize(640, 480)
        w.show()
        sys.exit(app.exec_())
    

    另外,我建议您阅读 What are the differences between event and signal in Qt 中 Qt 世界中事件和信号之间的区别,因为您说的是 click event,但在 Qt 世界中,必须说 clicked信号

    现在,如果要说到点子上,有以下选项:

    • 使用 keyPressEvent:

    class Dialog(QtWidgets.QDialog, UI):
        def __init__(self, parent=None):
            super(Dialog, self).__init__(parent)
            self.setupUi(self)
            self.button.clicked.connect(self.do_something)
    
        @QtCore.pyqtSlot()
        def do_something(self):
            print("do_something")
    
        def keyPressEvent(self, event):
            if event.key() == QtCore.Qt.Key_Tab:
                self.do_something()
    
    • 使用事件过滤器:

    class Dialog(QtWidgets.QDialog, UI):
        def __init__(self, parent=None):
            super(Dialog, self).__init__(parent)
            self.setupUi(self)
            self.button.clicked.connect(self.do_something)
    
        @QtCore.pyqtSlot()
        def do_something(self):
            print("do_something")
    
        def eventFilter(self, obj, event):
            if obj is self and event.type() == QtCore.QEvent.KeyPress:
                if event.key() == QtCore.Qt.Key_Tab:
                    self.do_something()
            return super(Dialog, self).eventFilter(obj, event)
    
    • 使用 QShorcut 的激活信号:

    class Dialog(QtWidgets.QDialog, UI):
        def __init__(self, parent=None):
            super(Dialog, self).__init__(parent)
            self.setupUi(self)
            self.button.clicked.connect(self.do_something)
            shortcut = QtWidgets.QShortcut(QtGui.QKeySequence(QtCore.Qt.Key_Tab), self)
            shortcut.activated.connect(self.do_something)
    
        @QtCore.pyqtSlot()
        def do_something(self):
            print("do_something")
    

    在前面的方法中,我更喜欢后者,因为您不需要覆盖任何内容,并且可以连接到多个函数。

    另一方面,只有当焦点在 Qt 窗口时才会检测到事件。

    【讨论】:

    • 对不起,Using an event filter + self.installEventFilter(self)。那么?
    • @S.Nick 我不明白你的问题。
    【解决方案2】:

    我假设你把你的小部件放在 QDialog 小部件中,所以如果你想实现你自己的按键事件,你应该覆盖你的 Dialog 小部件的 keyPressEvent, 那么它就可以随心所欲了。

    这是一个例子,

    from PyQt5.QtCore import Qt
    from PyQt5.QtWidgets import QDialog
    
    class UI(QDialog):
    
        def __init__(self):
            super(UI, self).__init__()
            # ...
            self.button.clicked.connect(self.do_something)
    
        def do_something(self):
            # Something here
    
        def keyPressEvent(self, event):
            # when press key is Tab call your function
            if event.key() == Qt.Key_Tab:
               self.do_something()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-11
      • 1970-01-01
      • 1970-01-01
      • 2020-03-09
      • 2010-12-30
      • 2023-03-03
      • 1970-01-01
      • 2011-09-19
      相关资源
      最近更新 更多