PyQt5 - 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, ini 'terhubung' ke a‘slot’. Slotnya bisa apa sajacallable Python function.

Menggunakan Editor Sinyal / Slot Qt Designer

Pertama desain formulir sederhana dengan kontrol LineEdit dan tombol tekan.

Diharapkan jika tombol ditekan, isi kotak teks harus dihapus. Widget QLineEdit memiliki metode clear () untuk tujuan ini. Karenanya, tombolnyaclicked sinyal harus disambungkan clear() metode kotak teks.

Untuk memulai, pilih Edit sinyal / slot dari menu Edit (atau tekan F4). Kemudian sorot tombol dengan mouse dan seret kursor ke kotak teks

Saat mouse dilepaskan, dialog yang menunjukkan sinyal tombol dan metode slot akan ditampilkan. Pilih sinyal yang diklik dan metode clear ()

Jendela Signal / Slot Editor di kanan bawah akan menunjukkan hasilnya -

Simpan kode ui dan Build dan Python dari file ui seperti yang ditunjukkan pada kode di bawah ini -

pyuic5 -x signalslot.ui -o signalslot.py

Kode Python yang dihasilkan akan memiliki koneksi antara sinyal dan slot dengan pernyataan berikut -

self.pushButton.clicked.connect(self.lineEdit.clear)

Jalankan signallot.py dan masukkan beberapa teks di LineEdit. Teks akan dihapus jika tombol ditekan.

Membangun Koneksi Slot Sinyal

Alih-alih menggunakan Designer, Anda dapat langsung membuat koneksi slot sinyal dengan mengikuti sintaks -

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 teknik berikut -

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.

Ketika b1 diklik, sinyal yang diklik () terhubung ke fungsi b1_clicked () -

b1.clicked.connect(b1_clicked())

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

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets 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)
   b2.clicked.connect(b2_clicked)
   
   win.setGeometry(100,100,200,100)

   win.setWindowTitle("PyQt5")
   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