Penggunaan Signals dan Slots di Qt

Penggunaan Signals dan Slots di Qt

Qt menyediakan fitur yang disebut "Signals dan Slots" untuk memungkinkan interaksi antar objek dalam program. Dalam artikel ini, kita akan membahas tentang penggunaan signals dan slots dalam Qt.

Membuat Slot

Sebuah slot adalah fungsi penerima yang digunakan untuk mendapatkan informasi tentang perubahan status di lainnya widget. Contohnya, LCDNumber menggunakan slot display() untuk menampilkan bilangan pada layar. Karena display() adalah bagian dari interface kelas dengan program lain, maka slot tersebut harus publik.

Beberapa contoh program Qt menghubungkan nilai Changed() signal scrollbar ke slot display(), sehingga LCD number terus menampilkan nilai scrollbar.

Signals dan Slots dengan Argumen Default

Tanda tangan sinyal dan slot dapat berisi argumen, dan argumen tersebut dapat memiliki nilai default. Contohnya, sinyal destroyed(QObject*) dari kelas QObject dipakai untuk memberikan peringatan ketika sebuah objek dihapus. Kita ingin memantau signal ini di mana pun kita memiliki referensi yang tidak valid ke objek yang sudah dihapus, sehingga kita dapat membersihkannya.

Sebuah slot dengan nama objectDestroyed(QObject* = nullptr) mungkin cocok untuk memproses sinyal tersebut. Untuk menghubungkan sinyal dan slot, kita menggunakan metode QObject::connect().

Menghubungkan Sinyal dan Slot

Ada beberapa cara untuk menghubungkan sinyal dan slot. Pertama, kita dapat menggunakan pointer fungsi:

connect(sender, &QObject::destroyed, this, &MyObject::objectDestroyed);

Kelebihan menggunakan QObject::connect() dengan pointer fungsi adalah bahwa compiler akan memeriksa apakah argumen sinyal cocok dengan argumen slot. Argumen juga dapat dikonversi secara implisit oleh compiler jika dibutuhkan.

Kita juga dapat menghubungkan ke functor atau lambda C++11:

connect(sender, &QObject::destroyed, this, [=](){ this->m_objects.remove(sender); });

Dalam kasus-kasus ini, kita memberikan konteks sebagai parameter ke call ke connect(). Konteks tersebut menyediakan informasi tentang thread di mana receiver akan dieksekusi. Ini sangat penting, karena memastikan bahwa receiver akan dieksekusi dalam thread yang sesuai.

Menggunakan Signals dan Slots dengan Default Argumen

Penggunaan signals dan slots dengan argumen default juga dapat dilakukan. Rule untuk menentukan apakah harus diinclude atau tidak adalah bahwa tanda tangan yang dipakai oleh SIGNAL() harus memiliki jumlah argumen yang sama dengan tanda tangan yang dipakai oleh SLOT().

Contohnya, semua dari berikut ini akan bekerja:

connect(sender, SIGNAL(destroyed(QObject*)), this, SLOT(objectDestroyed(QObject*)));
connect(sender, SIGNAL(destroyed(QObject*)), this, SLOT(objectDestroyed()));
connect(sender, SIGNAL(destroyed()), this, SLOT(objectDestroyed()));

Namun, yang tidak akan bekerja adalah:

connect(sender, SIGNAL(destroyed()), this, SLOT(objectDestroyed(QObject*)));

…karena slot tersebut akan mengharapkan sebuah QObject, tapi sinyal tidak akan mengirimnya. Koneksi ini akan melaporkan error runtime.

Penggunaan Signals dan Slots yang Canggih

Qt juga menyediakan fungsi QObject::sender() untuk mendapatkan informasi tentang pengirim sinyal. Fungsi ini kembali pointer ke objek yang mengirimkan sinyal.

Menggunakan Qt dengan Signals dan Slots Ketiga

Ada kemungkinan menggunakan Qt dengan signal/slot mekanisme ketiga. Kita dapat bahkan menggunakan baik mekanisme Qt dan 3rd party dalam proyek yang sama. Untuk melakukan itu, kita perlu menulis:

target_compile_definitions(my_app PRIVATE QT_NO_KEYWORDS)

dalam file CMake.

Dalam file .pro qmake, kita perlu menulis:

QT += no_keywords

Fungsi ini akan menginstruksikan Qt untuk tidak mendefinisikan kata-kata moc signals, slots, dan emit, karena nama-nama tersebut akan digunakan oleh library 3rd party, seperti Boost. Kemudian, untuk terus menggunakan signals dan slots Qt dengan flag no_keywords, kita harus mengganti semua penggunaan kata-kata Qt moc dalam sumber kode dengan macros Qt yang sesuai.

Signals dan Slots di Library Qt-based

API publik sebuah library Qt-based sebaiknya menggunakan kata-kata Q_SIGNALS dan Q_SLOTS daripada signals dan slots. Sebaliknya, sangat sulit untuk menggunakan library tersebut dalam program lain.

Dalam artikel ini, kita telah membahas tentang penggunaan signals dan slots di Qt, termasuk membuat slot, menghubungkan sinyal dan slot, serta menggunakan signals dan slots dengan argumen default. Dengan memahami cara kerja signals dan slots, kita dapat menciptakan program yang lebih interaktif dan efektif dalam Qt.