Передача текста PyQt QLineEdit в качестве параметра

Я пытаюсь отредактировать виджет QLineEdit, а затем отправить новый текст в качестве параметра функции, но он всегда возвращает исходный текст вместо нового текста. Вот фрагмент кода

self.shortCoffee1Label = QLineEdit("0")
self.shortCoffee1Label.editingFinished.connect(self.sendValue(48, int(self.shortCoffee1Label.text())))

а затем функция sendValue

    def sendValue(self, var, val):
        def emmitValue():
            self.messageReceived.setText("Sending new value...")
            print("var received: " + str(var))
            print("val received: " + str(val))
            self.thread.sendValue(var, val)
        return emmitValue

Но val всегда равен 0, что является исходным значением, на которое он был установлен. Что я делаю не так?


person lmagalhaes    schedule 06.04.2020    source источник
comment
По сути, человек, использующий ненужное и более сложное лямбда-выражение, не говорит вам, что при использовании оператора Connect вы не предоставляете ему вызов функции - также известный как Function(), но вы предоставляете ему функцию - также известный как Function тогда, если у вас есть параметры вы хотите передать, что вы делаете это внутри этой функции, поэтому у нас будет это self.shortCoffee1Label.editingFinished.connect(self.SendNewValue), тогда в def SendNewValue(self): у вас будет строка, которая вызывает то, что вы хотите, используя параметры следующим образом:   -  person Dennis Jensen    schedule 06.04.2020
comment
self.sendValue(48, int(self.shortCoffee1Label.text())), и это все, что вам нужно в этой функции, или есть другие способы сделать это, которые в равной степени менее сложны, чем добавление лямбда-выражения, поскольку это нарушает K.I.S.S. правило программирования (Keep It Simple and Smart), добавляя ненужную сложность, чтобы вместить как можно больше в одну строку кода, что уже давно доказало свою плохую методологию.   -  person Dennis Jensen    schedule 06.04.2020
comment
Но так как я хочу, чтобы несколько QLineEdits вызывали эту функцию sendValue, мне нужны оба параметра: var — это строка, которая отправила значение, а val — это значение строки редактирования. Если я сделаю это так, как вы предлагаете, я смогу только указать значение и не буду знать, из какой строки редактирования оно пришло, верно?   -  person lmagalhaes    schedule 07.04.2020


Ответы (2)


Если вам это нравится, программа сохранит значение «0» и прикрепит его к editFinished вместо того, чтобы обновлять его каждый раз, когда вы вызываете функцию. Поэтому вы должны использовать лямбда (извините за мой плохой английский):

self.shortCoffee1Label = QLineEdit("0")
self.shortCoffee1Label.editingFinished.connect(lambda: self.sendValue(48, int(self.shortCoffee1Label.text())))
person Amin Guermazi    schedule 06.04.2020
comment
добавление лямбды заставляет программу вообще не выполнять функцию - person lmagalhaes; 06.04.2020

Понятно.

Вот окончательный код:

self.shortCoffee1Label.editingFinished.connect(self.sendValue(48, self.shortCoffee1Label))

 def sendValue(self, var, val):
        def emmitValue():
            self.messageReceived.setText("Sending new value...")
            print("var received: " + str(var))
            print("val received: " + str(int(val.text())))
            self.thread.sendValue(var, int(val.text()))
        return emmitValue

Итак, идея заключалась в том, чтобы отправить сам объект в качестве параметра, чтобы я мог получить обновленный текст. Как оказалось, он может интерпретировать это как «отправить текст, который этот объект имел при компиляции». Отправив сам объект, проблема была решена.

person lmagalhaes    schedule 06.04.2020