Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 30, 2020 08:30:49

Ser5+
Зарегистрирован: 2019-11-18
Сообщения: 65
Репутация: +  1  -
Профиль   Отправить e-mail  

Автозаполнение поля ввода

Доброе утро. Есть диалоговое окно,с тремя полями ввода QLineEdit. Допустим в первых двух ввожу какие то числа,а в третьем автоматом заполняется по формуле из первых двух. То есть не по нажатию кнопки заполнять третье поле,а чтобы сразу в режиме реального времени заполнялось когда пишем что-то в первых двух полях. Как это все делается? Приведите хотя бы самый простой пример. Просто ее делаю в отдельной функции или ее надо в класс обернуть,что-то еще? Может в учебнике у прохоренка есть такое или плохо искал.
Сначала думал делают с помощью QCompleter,но вроде не то.

Офлайн

#2 Окт. 30, 2020 08:42:28

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 8138
Репутация: +  733  -
Профиль   Отправить e-mail  

Автозаполнение поля ввода

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().



Офлайн

#3 Окт. 30, 2020 08:50:07

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4085
Репутация: +  249  -
Профиль   Отправить e-mail  

Автозаполнение поля ввода

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

Ну и чуток здравого смысла. Вот вы одно поле вводите 5 во втором ничего Как вычислить результат? Ввели - это не валидное число (валидно например -50). Что делать?



Офлайн

#4 Окт. 30, 2020 09:19:52

Ser5+
Зарегистрирован: 2019-11-18
Сообщения: 65
Репутация: +  1  -
Профиль   Отправить e-mail  

Автозаполнение поля ввода

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))
ну и наверно логичнее добавить валидатор еще,так как при очистке поля будет ошибка.

Офлайн

#5 Окт. 30, 2020 10:24:56

Ser5+
Зарегистрирован: 2019-11-18
Сообщения: 65
Репутация: +  1  -
Профиль   Отправить e-mail  

Автозаполнение поля ввода

Примерно так у меня получилось.

 ...
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))
...

Отредактировано Ser5+ (Окт. 30, 2020 10:43:57)

Офлайн

#6 Окт. 30, 2020 10:43:36

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 8138
Репутация: +  733  -
Профиль   Отправить e-mail  

Автозаполнение поля ввода

Ser5+
поправьте если не так сделал
Нельзя аргументы перегружать сильно. Нужно делать что сигнал, что слот максимально простым. А всё сложное ты делаешь внутри слота. И слот делается в виде метода класса, тогда туда не нужно ничего передавать снаружи, потому что оно внутри класса доступно.



Офлайн

#7 Окт. 30, 2020 14:36:28

Ser5+
Зарегистрирован: 2019-11-18
Сообщения: 65
Репутация: +  1  -
Профиль   Отправить e-mail  

Автозаполнение поля ввода

py.user.next Но у меня этот кусок кода весь не в классе находится. Это отдельная ппг(функция). То есть из других мест открываю это диалоговое окно.
А так согласен с вами,что нужно в класс обернуть и эти функции были бы внутри класса и передавать параметры не нужно было бы.
В принципе может и переделаю,а так вопрос закрыт.


Отредактировано Ser5+ (Окт. 30, 2020 14:37:04)

Офлайн

#8 Окт. 30, 2020 18:45:10

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2535
Репутация: +  177  -
Профиль   Отправить e-mail  

Автозаполнение поля ввода

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

Вот за это надо руки отрывать. И пользуйся дизайнером, интерфейсы в ручную набирать не нужно.



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#9 Окт. 30, 2020 19:01:28

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 8138
Репутация: +  733  -
Профиль   Отправить e-mail  

Автозаполнение поля ввода

Ser5+
Но у меня этот кусок кода весь не в классе находится. Это отдельная ппг(функция). То есть из других мест открываю это диалоговое окно.
Это мы и так видим по твоему коду. Мы тут не бухгалтерши тупые, нам объяснять не надо



Офлайн

#10 Ноя. 2, 2020 10:15:52

Ser5+
Зарегистрирован: 2019-11-18
Сообщения: 65
Репутация: +  1  -
Профиль   Отправить e-mail  

Автозаполнение поля ввода

Rodegast
Почему сразу руки отрывать. Мне кажется нет смысла использовать везде классы. Я обычно класс использую один раз и только для главного окна. Если нужны события в каких-то других окнах,то да обертываю в класс.
На счет интерфейса по мне так вручную проще. Сначала с него и начинал с дизайнера,заморочился что-то в нем я и сразу выбросил его. Без него нормально пишу. Понятно что после .ui превращаем в .py и дальше работаем. Да не спорю что в нем проще,но как то оно не по мне,да и вручную сразу понимаешь где то напортачил и где править.

Отредактировано Ser5+ (Ноя. 2, 2020 10:45:10)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version