Найти - Пользователи
Полная версия: Автозаполнение поля ввода
Начало » GUI » Автозаполнение поля ввода
1 2
Ser5+
Доброе утро. Есть диалоговое окно,с тремя полями ввода QLineEdit. Допустим в первых двух ввожу какие то числа,а в третьем автоматом заполняется по формуле из первых двух. То есть не по нажатию кнопки заполнять третье поле,а чтобы сразу в режиме реального времени заполнялось когда пишем что-то в первых двух полях. Как это все делается? Приведите хотя бы самый простой пример. Просто ее делаю в отдельной функции или ее надо в класс обернуть,что-то еще? Может в учебнике у прохоренка есть такое или плохо искал.
Сначала думал делают с помощью QCompleter,но вроде не то.
py.user.next
Ser5+
Как это все делается?
Нужно сигнал от каждого из первых двух полей присоединить к слоту, который обновляет третье поле.

Сигнал для каждого поля из первых двух полей
void QLineEdit::textChanged ( const QString & text )
This signal is emitted whenever the text changes. The text argument is the new text.

Unlike textEdited(), this signal is also emitted when the text is changed programmatically, for example, by calling setText().

Слот третьего поля
void setText ( const QString & )

Но слот ты, скорее всего, делаешь сам в виде метода и внутри него уже используешь метод setText().
doza_and
Я думаю что для решения вашей задачи требуется только понимание самых азов разработки GUI а не выискивания специальных элементов.
При редактировании полей возникают события, правильная обработка которых позволит сделать желаемое.
См. Прохоренка про сигналы и слоты.

Ну и чуток здравого смысла. Вот вы одно поле вводите 5 во втором ничего Как вычислить результат? Ввели - это не валидное число (валидно например -50). Что делать?
Ser5+
py.user.next
Спасибо. Вроде бы понял,но поправьте если не так сделал.
 тут лабелы и лине
дальше делаю сигнал
Line1.textChanged.connect(lambda: line1(Line1.text(),Line2.text(),Line3,kolvo_tovar0))
Line2.textChanged.connect(lambda: line2(Line2.text(),Line2.text(),Line3,kolvo_tovar0))
И уже в функциях применяю set
def line1(Line1,Line2,Line3,kolvo_tovar0):
    print(Line1)
    kolvo_ross = float(kolvo_tovar0) - (int(Line1) * int(Line2))
    Line3.setText(str(kolvo_ross))
    
def line2(Line1,Line2,Line3,kolvo_tovar0):
    print(Line2)
    kolvo_ross = float(kolvo_tovar0) - (int(Line1) * int(Line2))
    Line3.setText(str(kolvo_ross))
ну и наверно логичнее добавить валидатор еще,так как при очистке поля будет ошибка.
Ser5+
Примерно так у меня получилось.
 ...
label1 = QtWidgets.QLabel('Кол-во коробок:', parent=dlg)
label1.setGeometry(20,50,150,20)
Line1 = QtWidgets.QLineEdit('0', parent=dlg)
Line1.setGeometry(180,50,200,20)
label2 = QtWidgets.QLabel('Кол-во упаковок в коробке:', parent=dlg)
label2.setGeometry(20,80,150,20)
Line2 = QtWidgets.QLineEdit('0', parent=dlg)
Line2.setGeometry(180,80,200,20)
label3 = QtWidgets.QLabel('Кол-во россыпью:', parent=dlg)
label3.setGeometry(20,110,150,20)
Line3 = QtWidgets.QLineEdit( '0', parent=dlg)
Line3.setGeometry(180,110,200,20)
 
#Валидатор
Line1.setValidator(QtGui.QIntValidator(0,1000,parent=dlg))
Line2.setValidator(QtGui.QIntValidator(0,1000,parent=dlg))
    
#textChanged() #Сигнал генерируется при изменении текста
Line1.textChanged.connect(lambda: line1(Line1.text(),Line2.text(),Line3,kolvo_tovar0))
Line2.textChanged.connect(lambda: line2(Line1.text(),Line2.text(),Line3,kolvo_tovar0))
 
def line1(Line1,Line2,Line3,kolvo_tovar0):
    if Line1.strip() != '' and Line2.strip() != '':
        kolvo_ross = float(kolvo_tovar0) - (int(Line1) * int(Line2))
        Line3.setText(str(kolvo_ross))
    
def line2(Line1,Line2,Line3,kolvo_tovar0):
    if Line1.strip() != '' and Line2.strip() != '':
        kolvo_ross = float(kolvo_tovar0) - (int(Line1) * int(Line2))
        Line3.setText(str(kolvo_ross))
...
py.user.next
Ser5+
поправьте если не так сделал
Нельзя аргументы перегружать сильно. Нужно делать что сигнал, что слот максимально простым. А всё сложное ты делаешь внутри слота. И слот делается в виде метода класса, тогда туда не нужно ничего передавать снаружи, потому что оно внутри класса доступно.
Ser5+
py.user.next Но у меня этот кусок кода весь не в классе находится. Это отдельная ппг(функция). То есть из других мест открываю это диалоговое окно.
А так согласен с вами,что нужно в класс обернуть и эти функции были бы внутри класса и передавать параметры не нужно было бы.
В принципе может и переделаю,а так вопрос закрыт.


Rodegast
> Но у меня этот кусок кода весь не в классе находится

Вот за это надо руки отрывать. И пользуйся дизайнером, интерфейсы в ручную набирать не нужно.
py.user.next
Ser5+
Но у меня этот кусок кода весь не в классе находится. Это отдельная ппг(функция). То есть из других мест открываю это диалоговое окно.
Это мы и так видим по твоему коду. Мы тут не бухгалтерши тупые, нам объяснять не надо
Ser5+
Rodegast
Почему сразу руки отрывать. Мне кажется нет смысла использовать везде классы. Я обычно класс использую один раз и только для главного окна. Если нужны события в каких-то других окнах,то да обертываю в класс.
На счет интерфейса по мне так вручную проще. Сначала с него и начинал с дизайнера,заморочился что-то в нем я и сразу выбросил его. Без него нормально пишу. Понятно что после .ui превращаем в .py и дальше работаем. Да не спорю что в нем проще,но как то оно не по мне,да и вручную сразу понимаешь где то напортачил и где править.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB