如何在PyQt5中允许Tab键按下事件

时间:2018-12-18 13:44:15

标签: python pyqt pyqt5

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

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

    def do_something(self):
        # Something here

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

非常感谢您。

2 个答案:

答案 0 :(得分:3)

要获得所需的方法,有很多方法,但是在观察代码指向它之前,我看到您已经使用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事件,但是在Qt世界中,您必须说点击信号

现在要讲的话,有以下几种选择:

  • 使用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窗口中时,仅检测到事件。

答案 1 :(得分:1)

我假设您将小部件放在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()