Python 如何在pyqt5中允许tab键按下事件

Python 如何在pyqt5中允许tab键按下事件,python,pyqt,pyqt5,Python,Pyqt,Pyqt5,假设我有一个名为按钮的QPushButton,我成功地执行了以下操作以允许单击事件: class UI(object): def setupUi(self, Dialog): # ... self.button.clicked.connect(self.do_something) def do_something(self): # Something here 我的问题是:当按下选项卡键时,如何调用do\u something(

假设我有一个名为
按钮的QPushButton
,我成功地执行了以下操作以允许单击事件:

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

    def do_something(self):
        # Something here
我的问题是:当按下选项卡键时,如何调用
do\u something()
?例如,如果我有一个名为
tb\u id
的QlineEdit,在输入一个值并按tab键后,
do\u something()
方法的调用方式应与上面单击的
方法相同。如何使用
pyqt5


非常感谢。

我假设您将小部件放在QDialog小部件中,因此如果您想要实现自己的按键事件,您应该覆盖对话框小部件的按键事件, 那它就可以随心所欲了

举个例子

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()

要获得您想要的内容,有许多方法,但在通过观察代码指向它之前,我发现您已经使用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_())
此外,我建议您在中阅读Qt世界中事件和信号之间的区别,因为您提到了click事件,但在Qt世界中,必须说clicked signal

现在,如果要说到这一点,有以下选项:

  • 使用按键事件:

  • 使用事件筛选器:

  • 使用QShorcut的激活信号:

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


另一方面,当焦点在Qt窗口中时,仅检测到事件。

对不起,
使用事件筛选器
+
self.installEventFilter(self)
。那么?@S.Nick我不明白你的问题。
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)
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")