Pembahasan Galat QObject::connect: Tidak Ada Slot Seperti Itu
Masalah Awal
Seorang pengguna membuat aplikasi kecil untuk universitas dan menemui galat "no such slot". Berikut kode yang digunakan:
// Game.h
Q_OBJECT
public slots:
void displayMainMenu();
void showHelp(Button &start, Button &score, Button &help, Button &quit);
Dalam Game, metode displayMainMenu membuat tombol dan menghubungkan sinyal clicked ke slot, termasuk showHelp dengan argumen pointer tombol.
connect(helpButton, SIGNAL(clicked()), this, SLOT(showHelp(playButton, scoresButton, helpButton, quitButton)));
Galat yang muncul: QObject::connect: No such slot Game::showHelp(playButton, scoresButton, helpButton, quitButton). Pengguna sudah membersihkan dan membangun ulang proyek, serta menyertakan makro Q_OBJECT.
Jawaban: Kesalahan Umum
Pembalas menjelaskan beberapa kesalahan mendasar:
- Saat menggunakan makro SIGNAL dan SLOT, hanya deklarasi tipe parameter yang harus diberikan, bukan nama variabel. Seharusnya:
SLOT(showHelp(Button &, Button &, Button &, Button &)) - Sinyal tanpa parameter (seperti clicked()) hanya bisa terhubung ke slot tanpa parameter. Oleh karena itu, showHelp harus dideklarasikan tanpa parameter.
- Metode displayMainMenu seharusnya dipanggil sekali (misalnya di konstruktor), bukan setiap kali menu ditampilkan, karena akan membuat tombol baru dan koneksi baru, serta pointer tombol menjadi zombie karena tidak disimpan sebagai anggota kelas.
- Deklarasi slot menggunakan referensi (
Button &) tetapi dalam panggilan connect digunakan pointer (playButton). Tidak cocok.
Pengakuan dan Perbaikan
Pengguna mengakui kesalahan dan berencana menjadikan tombol sebagai variabel anggota serta memperbaiki fungsi showHelp. Setelah diperbaiki, pengguna melaporkan bahwa masalah terselesaikan.
Klarifikasi Akhir
Pembalas mengoreksi pernyataan pengguna yang menyarankan untuk tidak menghubungkan sinyal tanpa argumen ke slot tanpa argumen. Justru sebaliknya, ini adalah praktik yang benar dan umum, misalnya QPushButton::clicked() dan QAction::triggered(). Slot tanpa parameter adalah satu-satunya cara untuk menangani sinyal tersebut.