TAB键在PYQT5和Python中的代码中不起作用

时间:2019-04-06 06:48:06

标签: python python-3.x pyqt pyqt5 keyboard-shortcuts

该程序需要的是,一旦我从键盘上按下 TAB ,它应该移至下一个字段并执行特定功能。

第一个字段中的功能是用户输入的“ ID”(数字)。然后,在按下 TAB 后,应提取特定的数字,这些数字就是“出生日期”。

通过“按钮”可以正常工作。但是,按Tab键无法正常工作并出现错误。请查看代码和图像。

我正在使用PYQT5和Python 3.7。

表格图片

在此链接中查看for图像:

enter image description here

代码


from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(800, 600)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.lineEdit = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit.setGeometry(QtCore.QRect(282, 130, 181, 41))
        self.lineEdit.setObjectName("lineEdit")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(216, 140, 51, 20)) 

        self.Handel_Buttons()
        self.keyPressEvent()

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.label.setText(_translate("MainWindow", "ID"))
        self.label_2.setText(_translate("MainWindow", "D.O.B"))
        self.pushButton.setText(_translate("MainWindow", "PushButton"))



    def Handel_Buttons(self):
        self.pushButton.clicked.connect(self.ID)

    def keyPressEvent(self):
        print('HI')
        if QtCore.Qt.Key_Tab:
            self.ID()

    def ID(self):
         number = self.lineEdit.text()
         #number = '279121100762'
        #print(int(number[5]))
         digit = int(number[5])
         digit1 = int(number[6])
         digit2 = int(number[3])
         digit3 = int(number[4])
         digit4 = int(number[1])
         digit5 = int(number[2])
        #self.textBrowser.append(str[digit,digit1])

         self.textBrowser.append ('%d%d/%d%d/19%d%d' % (digit, digit1,digit2,digit3,digit4,digit5))

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())


非常感谢,

1 个答案:

答案 0 :(得分:1)

您提供的代码无法执行,因此我花时间从头开始创建它。基本思想是通过eventFilter拦截QLineEdit的事件:

from PyQt5 import QtCore, QtWidgets

class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.id_le = QtWidgets.QLineEdit("279121100762")
        self.id_le.installEventFilter(self)
        self.dob_le = QtWidgets.QLineEdit()
        btn = QtWidgets.QPushButton(
            text="Press me",
            clicked=self.conversion
        )
        central_widget = QtWidgets.QWidget()
        self.setCentralWidget(central_widget)
        lay = QtWidgets.QFormLayout(central_widget)
        lay.addRow("ID", self.id_le)
        lay.addRow("D.O.B", self.dob_le)
        lay.addRow(btn)

    def eventFilter(self, obj, event):
        if self.id_le == obj and event.type() == QtCore.QEvent.KeyPress:
            if event.key() == QtCore.Qt.Key_Tab:
                QtCore.QTimer.singleShot(0, self.conversion)
        return super(MainWindow, self).eventFilter(obj, event)

    def conversion(self):
        id_value = self.id_le.text()
        if len(id_value) > 7:
            text = id_value[1:7]
            dt = QtCore.QDateTime.fromString(text, "yyddMM")
            if dt.isValid():
                self.dob_le.setText(dt.toString("dd/MM/yyyy"))
                return
        print("Invalid conversion")

if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())