Переход к следующей строке сканера штрих-кода - PullRequest
1 голос
/ 07 августа 2020

Я использую USB-сканер штрих-кода, чтобы установить текст поля Qt lineEdit для сканирования номера производственного заказа. Моя проблема в том, что после сканирования окно закрывается вместо перехода к следующему lineEdit_2 для сканирования номера элемента. Как настроить lineEdit, чтобы переместить курсор на следующую lineEdit_2 и быть готовым к следующему сканированию.

from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_Dialog(object):
    def setupUi(self, Dialog):
        Dialog.setObjectName("Dialog")
        Dialog.resize(400, 300)
        self.buttonBox = QtWidgets.QDialogButtonBox(Dialog)
        self.buttonBox.setGeometry(QtCore.QRect(290, 20, 81, 241))
        self.buttonBox.setOrientation(QtCore.Qt.Vertical)
        self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.Cancel|QtWidgets.QDialogButtonBox.Ok)
        self.buttonBox.setObjectName("buttonBox")
        self.lineEdit = QtWidgets.QLineEdit(Dialog)
        self.lineEdit.setGeometry(QtCore.QRect(50, 50, 113, 22))
        self.lineEdit.setObjectName("lineEdit")
        self.lineEdit_2 = QtWidgets.QLineEdit(Dialog)
        self.lineEdit_2.setGeometry(QtCore.QRect(50, 120, 113, 22))
        self.lineEdit_2.setObjectName("lineEdit_2")
        self.lineEdit_3 = QtWidgets.QLineEdit(Dialog)
        self.lineEdit_3.setGeometry(QtCore.QRect(50, 200, 113, 22))
        self.lineEdit_3.setObjectName("lineEdit_3")

        self.retranslateUi(Dialog)
        self.buttonBox.accepted.connect(Dialog.accept)
        self.buttonBox.rejected.connect(Dialog.reject)
        QtCore.QMetaObject.connectSlotsByName(Dialog)

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


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    Dialog = QtWidgets.QDialog()
    ui = Ui_Dialog()
    ui.setupUi(Dialog)
    Dialog.show()
    sys.exit(app.exec_())

1 Ответ

2 голосов
/ 07 августа 2020

По умолчанию кнопки QPushButton нажимаются, когда нажата клавиша ввода и QDialog находится в фокусе, и этот щелчок вызывает выброс отклоненного или принятого сигнала, который закрывает окно, и это обрабатывается по умолчанию и autoDefault, поэтому первым делом нужно переопределить это поведение.

С другой стороны, нажатие клавиши ввода не приводит к переходу к другому QLineEdit, в этом случае вы должны прослушать эту клавишу и использовать focusNextPrevChild для перемещения фокус.

Наконец, коды, сгенерированные QtDesigner, не должны изменяться, поэтому я предполагаю, что код, который вы показываете, находится в файле gui .py, и я буду реализовывать logi c в основном. ру:

import sys

from PyQt5 import QtCore, QtWidgets

from gui import Ui_Dialog


class Dialog(QtWidgets.QDialog, Ui_Dialog):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setupUi(self)
        self.show()
        for btn in self.buttonBox.buttons():
            btn.setDefault(False)
            btn.setAutoDefault(False)
            btn.setFocusPolicy(QtCore.Qt.NoFocus)

    def keyPressEvent(self, event):
        if event.key() in (QtCore.Qt.Key_Enter, QtCore.Qt.Key_Return):
            self.focusNextPrevChild(True)
        super().keyPressEvent(event)


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)

    w = Dialog()
    w.show()

    sys.exit(app.exec_())
...