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