PyQt - Sinyal & Slot

Tidak seperti aplikasi mode konsol, yang dijalankan secara berurutan, aplikasi berbasis GUI digerakkan oleh peristiwa. Fungsi atau metode dijalankan sebagai respons atas tindakan pengguna seperti mengklik tombol, memilih item dari koleksi atau klik mouse, dll., Disebutevents.

Widget yang digunakan untuk membangun antarmuka GUI bertindak sebagai sumber acara tersebut. Setiap widget PyQt, yang diturunkan dari kelas QObject, dirancang untuk memancarkan 'signal'sebagai tanggapan atas satu atau lebih peristiwa. Sinyal itu sendiri tidak melakukan tindakan apa pun. Sebaliknya, itu 'terhubung' ke 'slot'. Slotnya bisa apa sajacallable Python function.

Dalam PyQt, koneksi antara sinyal dan slot dapat dicapai dengan berbagai cara. Berikut ini adalah teknik yang paling umum digunakan -

QtCore.QObject.connect(widget, QtCore.SIGNAL(‘signalname’), slot_function)

Cara yang lebih mudah untuk memanggil fungsi slot, ketika sinyal dipancarkan oleh widget adalah sebagai berikut -

widget.signal.connect(slot_function)

Misalkan jika suatu fungsi dipanggil ketika sebuah tombol diklik. Di sini, sinyal yang diklik harus dihubungkan ke fungsi yang dapat dipanggil. Itu dapat dicapai dengan salah satu dari dua teknik berikut -

QtCore.QObject.connect(button, QtCore.SIGNAL(“clicked()”), slot_function)

atau

button.clicked.connect(slot_function)

Contoh

Dalam contoh berikut, dua objek QPushButton (b1 dan b2) ditambahkan di jendela QDialog. Kami ingin memanggil fungsi b1_clicked () dan b2_clicked () saat mengklik b1 dan b2 masing-masing.

Saat b1 diklik, sinyal diklik () terhubung ke fungsi b1_clicked ()

b1.clicked.connect(b1_clicked())

Ketika b2 diklik, sinyal yang diklik () terhubung ke fungsi b2_clicked ()

QObject.connect(b2, SIGNAL("clicked()"), b2_clicked)

Contoh

import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *

def window():
   app = QApplication(sys.argv)
   win = QDialog()
   b1 = QPushButton(win)
   b1.setText("Button1")
   b1.move(50,20)
   b1.clicked.connect(b1_clicked)

   b2 = QPushButton(win)
   b2.setText("Button2")
   b2.move(50,50)
   QObject.connect(b2,SIGNAL("clicked()"),b2_clicked)

   win.setGeometry(100,100,200,100)
   win.setWindowTitle("PyQt")
   win.show()
   sys.exit(app.exec_())

def b1_clicked():
   print "Button 1 clicked"

def b2_clicked():
   print "Button 2 clicked"

if __name__ == '__main__':
   window()

Kode di atas menghasilkan keluaran sebagai berikut -

Keluaran

Button 1 clicked
Button 2 clicked