Qt memiliki sistem signal-slot yang memungkinkan aplikasi berkomunikasi dengan cara yang efektif. Dalam artikel ini, kita akan membahas penggunaan lanjutan signals dan slots di Qt.
Membuat Slot untuk Menerima Informasi dari Widget Lain
Slot adalah fungsi penerima yang digunakan untuk menerima informasi tentang perubahan status pada widget lain. Contohnya, LCDNumber menggunakan slot tersebut untuk menampilkan nomor yang sesuai. Karena display() merupakan bagian dari antarmuka kelas dengan program lainnya, maka slot tersebut harus publik.
Beberapa contoh program Qt menghubungkan signal valueChanged() dari QScrollBar ke slot display(), sehingga LCD number terus menampilkan nilai scrollbar.
Penggunaan Signals dan Slots dengan Argumen Default
Tanda tangan signals dan slots dapat memiliki argumen, serta argumen dapat memiliki nilai default. Contohnya, QObject::destroyed() memiliki signal yang memungkinkan kita untuk menghandle peristiwa penghapusan objek.
Kita dapat membuat slot seperti berikut:
void objectDestroyed(QObject* obj = nullptr);
Untuk menghubungkan signal ke slot, kita menggunakan QObject::connect(). Ada beberapa cara untuk menghubungkan signal dan slots. 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, kita memberikan konteks this
dalam panggilan connect(). Konteks memberikan informasi tentang thread di mana penerima harus dieksekusi.
Menggunakan Signals dan Slots dengan Fungsi Lambda
Fungsi lambda adalah cara yang mudah untuk mempasskan argumen custom ke slot:
connect(action, &QAction::triggered, engine,
= { engine->processAction(action->text()); });
Penggunaan Signals dan Slots dengan 3rd Party
Qt dapat digunakan dengan mekanisme signal-slot 3rd party. Kita dapat menggunakan baik mekanisme Qt maupun 3rd party dalam proyek yang sama.
Untuk melakukan itu, kita perlu menulis berikut ke dalam file CMake project:
target_compile_definitions(my_app PRIVATE QT_NO_KEYWORDS)
Atau, jika kita menggunakan qmake, kita perlu menulis:
QT += core
TARGET = my_app
TEMPLATE = app
SOURCES += main.cpp
QMAKE_USE += Qt5
Menggunakan Signals dan Slots di Libray Qt-based
API publik library Qt-based harus menggunakan kata kunci Q_SIGNALS dan Q_SLOTS daripada signals dan slots. Jika tidak, maka library tersebut sulit digunakan dalam proyek yang mendefinisikan QT_NO_KEYWORDS.
Untuk mengatasi masalah ini, pengembang library dapat menyiapkan definisi preprocessor QT_NO_SIGNALS_SLOTS_KEYWORDS saat membangun library. Definisi ini menghilangkan signals dan slots tanpa mempengaruhi penggunaan kata kunci Qt lainnya dalam implementasikan library.