Pertemuan 2: Mekanisme Signals and Slots, Penanganan Event GUI, dan Interaksi Widget
Mekanisme Signals and Slots, Penanganan Event GUI, dan Interaksi Widget
Kajian mendalam mengenai mekanisme komunikasi antar obyek grafis dalam Qt Framework melalui paradigma Signals and Slots, teknik penanganan event interaksi pengguna (user interaction event handling), serta analisis kode implementasi widget input pada PySide6.
1. Paradigma Komunikasi Antar Objek: Signals and Slots
Dalam pemrograman GUI konvensional, komunikasi antar elemen visual kerap diimplementasikan menggunakan fungsi callback pointer yang kaku dan rawan terhadap kesalahan memori (dangling pointers). Qt mengatasi permasalahan tersebut melalui mekanisme Signals and Slots:
- Signal: Suatu notifikasi yang dipancarkan (emitted) oleh objek ketika kondisi internal atau tindakan pengguna tertentu terjadi. Sinyal tidak mengetahui fungsi apa yang akan menanggapinya, sehingga menjamin prinsip keterikatan longgar (loose coupling). Contoh sinyal bawaan:
clicked,textChanged,returnPressed,valueChanged. - Slot: Suatu fungsi callable Python biasa atau metode kelas C++ yang dieksekusi secara otomatis setiap kali sinyal yang terhubung dengannya dipancarkan.
- Karakteristik Keunggulan:
- Type Safety: Tipe argumen data yang dibawa oleh sinyal harus sesuai dengan parameter yang diterima oleh slot target.
- Many-to-Many Relationship: Satu sinyal dapat dihubungkan ke banyak slot sekaligus, dan satu slot dapat menerima koneksi dari banyak sinyal berbeda.
- Thread-Safe Delivery: Mekanisme antrean sinyal (queued connections) memungkinkan komunikasi aman antar-thread yang berbeda tanpa resiko race condition.
2. Sintaks dan Variasi Penghubungan Sinyal
Secara umum, koneksi sinyal ke slot didefinisikan menggunakan pola deklaratif:
# Format standar
pengirim.sinyal.connect(penerima_slot)
# Format dengan parameter kustom menggunakan lambda
self.tombol_angka.clicked.connect(lambda: self.proses_angka(7))
Pemutusan hubungan sinyal dapat dilakukan sewaktu-waktu menggunakan metode disconnect(), yang sangat berguna saat mencegah pemanggilan berulang rekursif pada saat memperbarui nilai widget secara terprogram.
3. Penanganan Event Tingkat Rendah (Low-Level Events)
Selain sinyal tingkat tinggi, Qt menyediakan penanganan event mentah (raw events) yang dikirim langsung oleh sistem windowing ke objek target turunan QObject:
mousePressEvent(event): Menangkap koordinat posisi klik kursor mouse dan tombol mana yang ditekan (kiri, kanan, tengah).keyPressEvent(event): Menangkap penekanan tombol keyboard fisik beserta tombol modifier (Ctrl, Shift, Alt).closeEvent(event): Mengintersepsi upaya penutupan jendela oleh pengguna untuk menampilkan dialog konfirmasi penyimpanan berkas sebelum aplikasi benar-benar dihentikan.
4. Bedah Implementasi Kode Praktikum (code1.py, code2.py, code3.py)
Praktikum pada sesi ini menguji pemahaman mahasiswa terhadap interaktivitas antarmuka melalui 3 variasi skenario kode:
- Bedah Skenario 1 (code1.py - Interaksi Tombol Dasar): Menghubungkan sinyal
clickeddariQPushButtonke fungsi pembaruan teks label status secara dinamis. - Bedah Skenario 2 (code2.py - Input Teks Terpandu): Menghubungkan sinyal
textChangeddanreturnPressedpada komponenQLineEdituntuk memvalidasi masukan nama pengguna dan menampilkan sambutan interaktif seketika. - Bedah Skenario 3 (code3.py - Sinkronisasi Kontrol Multi-Widget): Mengintegrasikan komponen nilai numerik ganda (seperti slider pengatur volume dan spinbox angka) secara dua arah (bidirectional synchronization), di mana perubahan nilai pada salah satu kontrol secara otomatis menggeser posisi kontrol pasangannya.
# Cuplikan Sinkronisasi Dua Arah (Dua Widget Saling Terhubung)
from PySide6.QtWidgets import QSlider, QSpinBox
from PySide6.QtCore import Qt
slider = QSlider(Qt.Horizontal)
spinbox = QSpinBox()
# Konfigurasi batas nilai
slider.setRange(0, 100)
spinbox.setRange(0, 100)
# Koneksi timbal balik sinyal dan slot
slider.valueChanged.connect(spinbox.setValue)
spinbox.valueChanged.connect(slider.setValue)
Penguasaan teknik penanganan sinyal dan slot ini menjadi fondasi krusial dalam merancang arsitektur aplikasi desktop berskala besar dengan pemisahan tegas antara logika tampilan antarmuka (UI layer) dan logika pemrosesan bisnis (business logic layer).