**Pendahuluan**
Sistem _signal dan slot_ adalah jantung dari mekanisme event handling di PyQt5. Artikel ini akan menjelaskan konsep fundamental ini melalui contoh aplikasi sederhana dengan dua tombol yang berinteraksi dengan field teks. Cocok untuk pemula yang ingin memahami dasar komunikasi antar komponen GUI.
---
### **Struktur Proyek**
1. **`main.py`** - File utama aplikasi
2. **`MainForm.py`** - Implementasi GUI dan logika signal-slot
---
### **1. File main.py**
```python
#!/usr/bin/python3
import sys
from PyQt5.QtWidgets import QApplication
from MainForm import MainForm
if __name__ == '__main__':
app = QApplication(sys.argv) # Inisialisasi aplikasi
window = MainForm() # Membuat form utama
window.show() # Tampilkan GUI
app.exec_() # Mulai event loop
```
**Penjelasan:**
- Membuat instance aplikasi Qt
- Menginisialisasi dan menampilkan form utama
- Memulai siklus event handling
---
### **2. File MainForm.py**
#### **Komponen GUI**
```python
from PyQt5.QtWidgets import (QWidget, QVBoxLayout,
QHBoxLayout, QLineEdit, QPushButton)
class MainForm(QWidget):
def __init__(self):
super().__init__()
self.setup_ui()
def setup_ui(self):
# Konfigurasi window
self.setGeometry(300, 300, 300, 100)
self.setWindowTitle('Demo Signal dan Slot')
# Komponen utama
self.lineEdit = QLineEdit("Demo signal dan slot")
self.clearButton = QPushButton('Bersihkan')
self.closeButton = QPushButton('Tutup')
```
#### **Tata Letak**
```python
# Horizontal layout untuk tombol
button_layout = QHBoxLayout()
button_layout.addWidget(self.clearButton)
button_layout.addWidget(self.closeButton)
# Vertical layout utama
main_layout = QVBoxLayout()
main_layout.addWidget(self.lineEdit)
main_layout.addLayout(button_layout)
self.setLayout(main_layout)
```
#### **Koneksi Signal-Slot**
```python
# Hubungkan signal klik tombol ke slot yang sesuai
self.clearButton.clicked.connect(self.lineEdit.clear)
self.closeButton.clicked.connect(self.close)
```
---
### **Konsep Signal dan Slot**
| Komponen | Signal | Slot | Deskripsi |
|--------------|--------------|-------------------|-------------------------------|
| QPushButton | clicked() | QLineEdit.clear() | Membersihkan teks |
| QPushButton | clicked() | QWidget.close() | Menutup aplikasi |
| QLineEdit | textChanged()| Custom function | Respon perubahan teks (contoh)|
---
### **Mekanisme Kerja**
1. **Signal**: Event yang dihasilkan komponen (misal: tombol diklik)
2. **Slot**: Fungsi yang akan dieksekusi sebagai respons
3. **Koneksi**: Menghubungkan signal ke slot menggunakan `connect()`
**Visualisasi:**
```
[Tombol Bersihkan] --clicked()--> [lineEdit.clear()]
[Tombol Tutup] --clicked()--> [window.close()]
```
---
### **Custom Signal-Slot**
Contoh menambahkan fungsi kustom:
```python
# Tambahkan di class MainForm
def show_text_length(self):
text = self.lineEdit.text()
QMessageBox.information(self, 'Info', f"Panjang teks: {len(text)}")
# Hubungkan ke signal textChanged
self.lineEdit.textChanged.connect(self.show_text_length)
```
---
### **Best Practices**
1. **Gunakan Lambda untuk Parameter**
```python
self.button.clicked.connect(lambda: print("Tombol diklik"))
```
2. **Pisahkan Logika Bisnis**
Buat slot sebagai metode terpisah:
```python
def handle_clear(self):
self.lineEdit.clear()
logger.info("Field teks dibersihkan")
```
3. **Manajemen Koneksi**
- Putuskan koneksi jika perlu dengan `disconnect()`
- Hindari multiple connection ke slot yang sama
---
### **Troubleshooting Umum**
1. **Slot Tidak Terpanggil**
- Pastikan sudah memanggil `connect()`
- Cek tidak ada typo dalam nama slot
2. **Signal Tidak Sesuai**
- Verifikasi jenis signal yang tersedia di dokumentasi
Contoh signal QPushButton:
- clicked()
- pressed()
- released()
3. **Masuk ke Infinite Loop**
Hindari memicu signal secara rekursif
---
### **Kesimpulan**
Sistem signal-slot PyQt5 memungkinkan:
✅ Komunikasi antar komponen yang efisien
✅ Dekoupling antara UI dan logika bisnis
✅ Penanganan event yang fleksibel
**Latihan:** Coba tambahkan tombol baru yang mengubah warna teks saat diklik!
---
**Referensi Tambahan:**
- [Daftar Signal Bawaan Qt](https://doc.qt.io/qt-5/signalsandslots.html)
- [PyQt5 Signal-Slot Documentation](https://www.riverbankcomputing.com/static/Docs/PyQt5/signals_slots.html)
Komentar
Posting Komentar