PySide: Menghubungkan Banyak Widget ke Slot yang Sama
PySide: Menghubungkan Banyak Widget ke Slot yang Sama
Tutorial ini membahas cara menghubungkan beberapa widget ke slot yang sama. Dengan kata lain, kita akan mengikat sinyal widget (event) ke slot (callable seperti fungsi atau metode) yang dikenal sebagai penangan event. Ada dua pendekatan utama: menggunakan functoolsl untuk melewatkan parameter, atau menggunakan kemampuan instrospeksi PySide untuk mengambil informasi dari widget pemanggil. Metode lainnya adalah menggunakan fungsi lambda. Berikut penjelasan masing-masing.
Memulai
Jika Anda belum memiliki PySide, instal terlebih dahulu. Untuk PyQt, pastikan versi 4.3 atau lebih baru agar contoh partial berikut berfungsi. Kode di bawah menunjukkan penggunaan berbagai metode.
from functools import partialfrom PySide import SIGNALfrom PySide import QApplication, QLabel, QWidgetfrom PySide import QPushButton, QVBoxLayout########################################################################class MultiButtonDemo(QWidget): """""" #---------------------------------------------------------------------- def __init__ (self): """Constructor""" super(MultiButtonDemo, self). __init__ () layout = QVBoxLayout() self = QLabel("You haven't pressed a button!") # use a normal signal / slot mechanic button1 = QPushButton("One") selft(button1, SIGNAL("clicked()"), self) # now let's use partial functions button2 = QPushButton("Two") selft(button2, SIGNAL("clicked()"), partial(selfon, "Two")) button3 = QPushButton("Three") self3Callback = partial(selfon, "Three") clickedt(self3Callback) # now let's try using a lambda function button4 = QPushButton("Four") clickedt(lambda name="Four": selfon(name)) layoutget(self) layoutget(button1) layoutget(button2) layoutget(button3) layoutget(button4) selfout(layout) selfdowTitle("PySide Demo") #---------------------------------------------------------------------- def one(self): """""" labelt("You pressed One!") #---------------------------------------------------------------------- def onButton(self, lbl): """Change the label to the text (lbl) passed in""" labelt("You pressed %s!" % lbl)#----------------------------------------------------------------------if __name__ == "__main__": app = QApplication([]) form = MultiButtonDemo() form() app_()Penjelasan: Kita membuat subkelas QWidget sebagai jendela. Tata letak menggunakan QVBoxLayout vertikal. Tombol pertama dihubungkan dengan cara standar ke metode one. Tombol kedua menggunakan functoolsl untuk memanggil onButton dengan argumen "Two". Tombol ketiga juga menggunakan partial tetapi disimpan sebagai atribut kelas. Tombol keempat menggunakan lambda dengan parameter default. Semua tombol kecuali tombol pertama menggunakan metode onButton yang menerima label sebagai argumen.
Cara Membuat PySide Memberi Tahu
Kode berikut menunjukkan cara membuat semua tombol terhubung ke satu slot dan menggunakan self() untuk mengidentifikasi tombol yang ditekan.
from PySide import SIGNALfrom PySide import QApplication, QLabel, QWidgetfrom PySide import QPushButton, QVBoxLayout########################################################################class MultiButtonDemo(QWidget): """""" #---------------------------------------------------------------------- def __init__ (self): """Constructor""" super(MultiButtonDemo, self). __init__ () layout = QVBoxLayout() self = QLabel("You haven't pressed a button!") layoutget(self) labels = ["One", "Two", "Three", "Four"] for label in labels: btn = QPushButton(label) clickedt(selfd) layoutget(btn) selfout(layout) selfdowTitle("PySide Signals / Slots Demo") #---------------------------------------------------------------------- def clicked(self): """ Change label based on what button was pressed """ button = self() if isinstance(button, QPushButton): labelt("You pressed %s!" % button())#----------------------------------------------------------------------if __name__ == "__main__": app = QApplication([]) form = MultiButtonDemo() form() app_()Dalam kode ini, kita membuat daftar label tombol dan melakukan loop untuk membuat tombol. Setiap tombol dihubungkan ke metode clicked. Metode tersebut menggunakan self() untuk mendapatkan objek tombol asal, lalu memeriksa apakah itu instance QPushButton dan mengambil teksnya untuk memperbarui label.
Kesimpulan
Sekarang Anda telah mempelajari beberapa cara untuk melewatkan argumen ke slot/handler, serta cara menanyakan PySide widget mana yang memicu slot. Anda dapat menerapkannya dalam proyek Anda sendiri.
Platform Lainnya
Berita Piala Dunia
online casino deutschland gesetz
Jika Anda memiliki pertanyaan, silakan kirim email ke [email protected]