Melewati teks PyQt QLineEdit sebagai parameter

Saya mencoba mengedit widget QLineEdit dan kemudian mengirim teks baru sebagai parameter ke suatu fungsi, tetapi selalu mengembalikan teks asli, bukan teks baru. Berikut cuplikan kodenya

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

dan kemudian fungsi 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

Tapi val selalu 0, yang merupakan nilai asli yang ditetapkan. Apa yang saya lakukan salah?


person lmagalhaes    schedule 06.04.2020    source sumber
comment
Pada dasarnya apa yang tidak diberitahukan oleh individu yang menggunakan ekspresi Lambda yang tidak perlu dan lebih kompleks kepada Anda adalah bahwa ketika menggunakan pernyataan Connect Anda tidak menyediakannya dengan pemanggilan fungsi - alias Function() tetapi Anda menyediakannya dengan fungsi - alias Function maka jika Anda memiliki parameter Anda ingin meneruskannya, Anda melakukannya di dalam fungsi itu sehingga kita akan memiliki self.shortCoffee1Label.editingFinished.connect(self.SendNewValue) ini, lalu di def SendNewValue(self): Anda akan memiliki baris yang memanggil apa yang Anda inginkan menggunakan parameter sebagai berikut:   -  person Dennis Jensen    schedule 06.04.2020
comment
self.sendValue(48, int(self.shortCoffee1Label.text())) dan hanya itu yang Anda perlukan dalam fungsi itu atau ada cara lain untuk melakukan ini yang tidak terlalu rumit dibandingkan menambahkan ekspresi Lambda karena melanggar K.I.S.S. aturan pemrograman (Tetap Sederhana dan Cerdas) dengan menambahkan kompleksitas yang tidak perlu untuk memasukkan sebanyak mungkin hal dalam satu baris kode -- yang telah terbukti menjadi metodologi yang buruk sejak lama.   -  person Dennis Jensen    schedule 06.04.2020
comment
Tetapi karena saya ingin memiliki beberapa QLineEdit untuk menampilkan fungsi sendValue tersebut, saya memerlukan kedua parameter - var adalah lineedit yang mengirimkan nilai dan val adalah nilai dari edit baris. Jika saya melakukannya seperti yang Anda usulkan, saya hanya akan dapat membuang nilainya dan tidak akan tahu dari baris mana edit itu berasal, bukan?   -  person lmagalhaes    schedule 07.04.2020


Jawaban (2)


Jika Anda menyukainya, program akan menyimpan nilai "0" dan melampirkannya ke editingFinished alih-alih menyegarkannya setiap kali Anda memanggil fungsi tersebut. Jadi, Anda harus menggunakan lambda (maaf atas bahasa Inggris saya yang buruk):

self.shortCoffee1Label = QLineEdit("0")
self.shortCoffee1Label.editingFinished.connect(lambda: self.sendValue(48, int(self.shortCoffee1Label.text())))
person Amin Guermazi    schedule 06.04.2020
comment
menambahkan lambda membuat program tidak menjalankan fungsinya sama sekali - person lmagalhaes; 06.04.2020

Mengerti.

Inilah kode terakhirnya:

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

Jadi idenya adalah mengirimkan objek itu sendiri sebagai parameter sehingga saya bisa mengambil teks yang diperbarui. Ternyata, hal itu mungkin diartikan sebagai "kirim teks yang dimiliki objek ini saat dikompilasi". Dengan mengirimkan objek itu sendiri, masalah teratasi.

person lmagalhaes    schedule 06.04.2020