Mengapakah Menggunakan Ungkapan Lambda Dengan Slot PyQt Membawa kepada Gelagat Tidak Dijangka?

Patricia Arquette
Lepaskan: 2024-11-19 20:43:02
asal
878 orang telah melayarinya

Why Does Using Lambda Expressions With PyQt Slots Lead to Unexpected Behavior?

Menggunakan Ungkapan Lambda untuk Menyambung Slot dalam PyQt

Dalam PyQt, ungkapan lambda boleh digunakan untuk menyambung isyarat ke slot. Walau bagaimanapun, menggunakan ungkapan lambda dalam senario tertentu boleh membawa kepada tingkah laku yang tidak dijangka.

Pertimbangkan kod berikut:

class MainWindow(QtGui.QWidget):
    def __init__(self):
        ...
        self.buttons = []
        for idx in [3, 4]:
            button = QtGui.QPushButton('Button {} auto'.format(idx), self)
            button.clicked.connect(lambda x=idx: self.button_pushed(x))
            self.buttons.append(button)
            main_layout.addWidget(button)
Salin selepas log masuk

Apabila butang diklik, bukannya menerima nilai yang dijangkakan 3 dan 4 , kaedah button_pushed menerima False.

Sebab bagi kelakuan ini ialah isyarat QPushButton yang diklik mengeluarkan hujah yang menunjukkan keadaan butang. Apabila menggunakan ungkapan lambda dalam slot, nilai yang ditetapkan (seperti x=idx dalam kes ini) ditimpa oleh hujah yang dipancarkan.

Untuk menyelesaikan isu ini, ungkapan lambda harus mengabaikan keadaan butang dan menggunakan parameter tambahan bernama:

button.clicked.connect(lambda state, x=idx: self.button_pushed(x))
Salin selepas log masuk

Pengubahsuaian ini memastikan bahawa nilai yang betul dihantar kepada kaedah button_push, tanpa mengira keadaan butang.

Memahami mekanisme ekspresi lambda juga penting. Dalam konteks sambungan slot, fungsi lambda tidak dinilai apabila isyarat menyala. Sebaliknya, penunjuk kepada fungsi (dengan parameter yang diganti) disambungkan kepada isyarat. Apabila isyarat dipancarkan, fungsi yang disambungkan dipanggil dengan hujah yang dilalui oleh isyarat.

Atas ialah kandungan terperinci Mengapakah Menggunakan Ungkapan Lambda Dengan Slot PyQt Membawa kepada Gelagat Tidak Dijangka?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan