Как разрешить QLineEdit обнаруживать нажатие клавиши Tab - PullRequest
0 голосов
/ 19 декабря 2018

Этот пост перефразирует мой вопрос, размещенный здесь по-другому.Я хочу, чтобы QlineEdit обнаружил Tab Key нажатие, чтобы вызвать метод с именем do_something().Я сгенерировал следующий код pyqt5 из Qt Designer, который включает в себя экземпляр QlineEdit с именем lineEdit.Когда я набираю SSN число и нажимаю клавишу табуляции, метод должен быть вызван.Как я могу это сделать?

from PyQt5.QtWidgets import QApplication
from PyQt5 import QtCore, QtGui, QtWidgets
import sys

class Ui_Dialog(object):
    def setupUi(self, Dialog):
        Dialog.setObjectName("Dialog")
        Dialog.resize(348, 68)
        self.label = QtWidgets.QLabel(Dialog)
        self.label.setGeometry(QtCore.QRect(40, 20, 41, 16))
        self.label.setObjectName("label")
        self.lineEdit = QtWidgets.QLineEdit(Dialog)
        self.lineEdit.setGeometry(QtCore.QRect(80, 20, 201, 21))
        self.lineEdit.setObjectName("lineEdit")

        self.retranslateUi(Dialog)
        QtCore.QMetaObject.connectSlotsByName(Dialog)

    def do_something():
        print('Success!')

    def retranslateUi(self, Dialog):
        _translate = QtCore.QCoreApplication.translate
        Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
        self.label.setText(_translate("Dialog", "SSN"))

Ответы [ 2 ]

0 голосов
/ 23 декабря 2018

Гораздо проще, у меня был успех с созданием подкласса QLineEdit и переопределением его метода события следующим образом:

class EditSpec(QLineEdit):
    def event(self,event):
        if event.type() == QEvent.KeyPress and event.key() == Qt.Key_Tab:
            self.tabFollow()
            return True
        else:
            return QLineEdit.event(self,event)          
    def tabFollow(self):
        print("tab-key pressed!")

Любое нажатие клавиши без табуляции происходит нормально, в то время как нажатие клавиши табуляции приводит кМетод tabFollow для стрельбы.Чтобы добавить (и это важно), переопределение метода keyPressEvent не предотвращает запуск события через систему событий приложения.Только переопределив метод события способом, аналогичным описанному выше, это удалось.

0 голосов
/ 19 декабря 2018

Самый простой вариант, как указано в моем предыдущем ответе, заключается в использовании QShorcut, вы должны передать в качестве виджета QLineEdit и контекст, который в этом случае должен быть Qt::WidgetWithChildrenShortcut

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_Dialog(object):
    def setupUi(self, Dialog):
        Dialog.setObjectName("Dialog")
        Dialog.resize(348, 68)
        self.label = QtWidgets.QLabel(Dialog)
        self.label.setGeometry(QtCore.QRect(40, 20, 41, 16))
        self.label.setObjectName("label")
        self.lineEdit = QtWidgets.QLineEdit(Dialog)
        self.lineEdit.setGeometry(QtCore.QRect(80, 20, 201, 21))
        self.retranslateUi(Dialog)
        QtCore.QMetaObject.connectSlotsByName(Dialog)

    def retranslateUi(self, Dialog):
        _translate = QtCore.QCoreApplication.translate
        Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
        self.label.setText(_translate("Dialog", "SSN"))

class Dialog(QtWidgets.QDialog, Ui_Dialog):
    def __init__(self, parent=None):
        super(Dialog, self).__init__(parent)
        self.setupUi(self)
        shortcut = QtWidgets.QShortcut(
            QtGui.QKeySequence(QtCore.Qt.Key_Tab), 
            self.lineEdit, 
            context= QtCore.Qt.WidgetWithChildrenShortcut,
            activated=self.do_something)

    @QtCore.pyqtSlot()
    def do_something(self):
        print('Success!')

if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    w = Dialog()
    w.show()
    sys.exit(app.exec_())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...