Форум сайта python.su
Доброе утро. Есть диалоговое окно,с тремя полями ввода QLineEdit. Допустим в первых двух ввожу какие то числа,а в третьем автоматом заполняется по формуле из первых двух. То есть не по нажатию кнопки заполнять третье поле,а чтобы сразу в режиме реального времени заполнялось когда пишем что-то в первых двух полях. Как это все делается? Приведите хотя бы самый простой пример. Просто ее делаю в отдельной функции или ее надо в класс обернуть,что-то еще? Может в учебнике у прохоренка есть такое или плохо искал.
Сначала думал делают с помощью QCompleter,но вроде не то.
Офлайн
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 & )
Офлайн
Я думаю что для решения вашей задачи требуется только понимание самых азов разработки GUI а не выискивания специальных элементов.
При редактировании полей возникают события, правильная обработка которых позволит сделать желаемое.
См. Прохоренка про сигналы и слоты.
Ну и чуток здравого смысла. Вот вы одно поле вводите 5 во втором ничего Как вычислить результат? Ввели - это не валидное число (валидно например -50). Что делать?
Офлайн
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))
Офлайн
Примерно так у меня получилось.
... 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)
Офлайн
Ser5+Нельзя аргументы перегружать сильно. Нужно делать что сигнал, что слот максимально простым. А всё сложное ты делаешь внутри слота. И слот делается в виде метода класса, тогда туда не нужно ничего передавать снаружи, потому что оно внутри класса доступно.
поправьте если не так сделал
Офлайн
py.user.next Но у меня этот кусок кода весь не в классе находится. Это отдельная ппг(функция). То есть из других мест открываю это диалоговое окно.
А так согласен с вами,что нужно в класс обернуть и эти функции были бы внутри класса и передавать параметры не нужно было бы.
В принципе может и переделаю,а так вопрос закрыт.
Отредактировано Ser5+ (Окт. 30, 2020 14:37:04)
Офлайн
> Но у меня этот кусок кода весь не в классе находится
Вот за это надо руки отрывать. И пользуйся дизайнером, интерфейсы в ручную набирать не нужно.
Офлайн
Ser5+Это мы и так видим по твоему коду. Мы тут не бухгалтерши тупые, нам объяснять не надо
Но у меня этот кусок кода весь не в классе находится. Это отдельная ппг(функция). То есть из других мест открываю это диалоговое окно.
Офлайн
Rodegast
Почему сразу руки отрывать. Мне кажется нет смысла использовать везде классы. Я обычно класс использую один раз и только для главного окна. Если нужны события в каких-то других окнах,то да обертываю в класс.
На счет интерфейса по мне так вручную проще. Сначала с него и начинал с дизайнера,заморочился что-то в нем я и сразу выбросил его. Без него нормально пишу. Понятно что после .ui превращаем в .py и дальше работаем. Да не спорю что в нем проще,но как то оно не по мне,да и вручную сразу понимаешь где то напортачил и где править.
Отредактировано Ser5+ (Ноя. 2, 2020 10:45:10)
Офлайн