Qt menyediakan mekanisme signal dan slot yang memungkinkan komunikasi antara objek-objek dalam program. Dalam artikel ini, kita akan membahas penggunaan signal dan slot di Qt, termasuk contoh-contohnya.
Menggunakan Slot
Slot adalah fungsi yang digunakan untuk menerima informasi tentang perubahan state pada widget lainnya. Contohnya, LCDNumber menggunakan slot display() untuk menampilkan bilangan yang ditunjukkan. Karena display() adalah bagian dari interface class dengan program lainnya, maka slot harus publik.
Beberapa contoh program Qt menghubungkan nilai ValueChanged() signal of a QScrollBar ke slot display(), sehingga LCD number terus menampilkan nilai scrollbar.
Signal dan Slot dengan Argumen Default
Signatures signal dan slot dapat berisi argumen, dan argumen dapat memiliki nilai default. Contohnya, QObject::destroyed() adalah signal yang dipublikasikan ketika objek QObject dihapus. Kami ingin tangkap signal ini untuk membersihkan referensi objek yang telah dihapus.
Sebuah slot signature yang sesuai mungkin berupa:
void objectDestroyed(QObject* obj = nullptr);
Untuk menghubungkan signal ke slot, kita menggunakan QObject::connect(). Ada beberapa cara untuk menghubungkan signal dan slot. Pertama, kita dapat menggunakan pointer fungsi:
connect(sender, &QObject::destroyed, this, &MyObject::objectDestroyed);
Kelebihan penggunaan QObject::connect() dengan pointer fungsi adalah bahwa compiler dapat memeriksa apakah argumen signal kompatibel dengan argumen slot.
Kita juga dapat menghubungkan ke functor atau lambda C++11:
connect(sender, &QObject::destroyed, this, ={ this->m_objects.remove(sender); });
Dalam kedua kasus ini, kita memberikan konteks this
dalam panggilan connect(). Konteks objek memberikan informasi tentang thread mana receiver harus dieksekusi.
Penggunaan Lambda
Lambda expression adalah cara yang nyaman untuk melewatkan argument custom ke slot:
connect(action, &QAction::triggered, engine,
= { engine->processAction(action->text()); });
Menggunakan Signal dan Slot dengan 3rd Party
Dapat dipakai Qt dengan mekanisme signal/slot 3rd party. Kita dapat menggunakan baik mekanisme ini dalam proyek yang sama.
Untuk melakukan itu, tuliskan berikut ke dalam file CMake project:
target_compile_definitions(my_app PRIVATE QT_NO_KEYWORDS)
Atau, jika kita menggunakan qmake, tuliskan:
This will tell Qt not to define the moc keywords signals, slots, and emit, because these names will be used by a 3rd party library, e.g. Boost.
Signal dan Slot di Library Qt-based
API publik dari library Qt-based harus menggunakan kata kunci Q_SIGNALS dan Q_SLOTS daripada signal dan slot. Karena itu, kita dapat menggunakan library ini dalam proyek yang memiliki definisi QT_NO_KEYWORDS.
Untuk menegakkan ini, pembuat library dapat mengatur definisi preprocessor QT_NO_SIGNALS_SLOTS_KEYWORDS saat membangun library.
Definisi ini akan menghapus signal dan slot tanpa mempengaruhi apakah kata kunci Qt lainnya dapat digunakan dalam implementasi library.