Перевод курсора с одного QLineEdit в другой в определенном порядке

Рейтинг: 0Ответов: 3Опубликовано: 28.07.2023

Имеется несколько QLineEdit с ограничением по количеству символов:

self.ui.line1.setMaxLength(4)
self.ui.line2.setMaxLength(6)
self.ui.line3.setMaxLength(8)

Но простого ограничения длины не хватает для удобства.

Написаны функции, которые отлавливают количество введённых символов:

self.ui.line1.textEdited.connect(self.Change4)
    
def Change4(self):
        if len(self.ui.line1.text())==4:
            self.ui.lineStatus.setText("УРА") #вопрос..
            return

Что сюда вставить, чтобы после ввода нужного количества символов, было не "ура", а принудительный перевод курсора на line2 или line3 (чтобы порядок именно задавался, например line1-line3-line2)?

Ответы

▲ 0Принят
class Window(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
        self.line1 = QtWidgets.QLineEdit()
        self.line2 = QtWidgets.QLineEdit()

        self.line1.textEdited.connect(self.checkLen)
        self.line1.setMaxLength(4)                      # Тоже необходимо 
        
        self.vbox = QtWidgets.QVBoxLayout(self)
        
        self.vbox.addWidget(self.line1)
        self.vbox.addWidget(self.line2)
        
        self.show()

    def checkLen(self):
        if len(self.line1.text()) == 4:
            self.line2.setFocus()           # Вместо "self.line2" ваше значение

Как-то так, будут вопросы задавайте

▲ 0

Пожалуйста, всегда предоставляйте минимально-воспроизводимый пример, который демонстрирует проблему.

Ваша задача может выглядеть примерно так:

import sys
from PyQt5 import QtCore, QtWidgets,QtGui


class MainWindow(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()

        self.line1 = QtWidgets.QLineEdit()
        self.line1.setObjectName('line1')
        self.line1.setMaxLength(4)
        self.line1.textEdited.connect(
            lambda text, obj=self.line1.objectName(): self.change_textEdited(text, obj))
        self.line2 = QtWidgets.QLineEdit() 
        self.line2.setObjectName('line2')
        self.line2.setMaxLength(6)
        self.line2.textEdited.connect(
            lambda text, obj=self.line2.objectName(): self.change_textEdited(text, obj))        
        self.line3 = QtWidgets.QLineEdit()
        self.line3.setObjectName('line3')
        self.line3.setMaxLength(8)
        self.line3.textEdited.connect(
            lambda text, obj=self.line3.objectName(): self.change_textEdited(text, obj))        

        self.pushButton = QtWidgets.QPushButton('Button')

        self.layout = QtWidgets.QVBoxLayout(self)
        self.layout.addWidget(self.line1)
        self.layout.addWidget(self.line2)
        self.layout.addWidget(self.line3)
        self.layout.addWidget(self.pushButton)
        
    def change_textEdited(self, text, obj):
        if obj == 'line1' and len(text) == 4:
            self.line1.setStyleSheet("color: #00FF00;")
            self.line3.setFocus()
        elif obj == 'line1' and len(text) != 4:    
            self.line1.setStyleSheet("")
        elif obj == 'line2' and len(text) == 6:
            self.line2.setStyleSheet("color: #00FF00;")
            self.pushButton.setFocus()
            self.pushButton.setText('Все заполнили?')
            self.pushButton.setStyleSheet("background-color: #90EE90;")
        elif obj == 'line2' and len(text) != 6:      
            self.line2.setStyleSheet("")     
        elif obj == 'line3' and len(text) == 8:
            self.line3.setStyleSheet("color: #00FF00;")
            self.line2.setFocus()
        elif obj == 'line3' and len(text) != 8:     
            self.line3.setStyleSheet("")              
            

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    app.setFont(QtGui.QFont("Times", 14, QtGui.QFont.Bold))
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())

введите сюда описание изображения

▲ 0

Для PyQt6 это будет выглядеть как:

class MainWindow(mainwindow.Ui_MainWindow, QMainWindow):
def __init__(self):
.....

    self.ui.Где_надо_перехватить.setMaxLength(4) #вообще перенос работает и без 
                                                 #этой строчки
    self.ui.Где_надо_перехватить.textEdited.connect(self.Change4)

    def Change4(self):
        if len(self.ui.Где_надо_перехватить.text())==4:
         self.ui.Куда_надо_переместить_курсор.setFocus()
         return