Signals dan slots adalah dua konsep yang paling fundamental dalam Qt. Signals adalah fungsi yang memungkinkan aplikasi untuk mengirimkan sinyal ke bagian lainnya, sedangkan slots adalah fungsi yang dipanggil ketika signal terjadi.
Dalam artikel ini, kita akan membahas cara menggunakan signals dan slots dalam Qt, serta beberapa contoh penggunaannya.
Menggunakan Signals dan Slots
Signals dan slots dapat digunakan dengan cara yang berbeda. Salah satu cara adalah dengan menggunakan function pointers:
connect(sender, &QObject::destroyed, this, &MyObject::objectDestroyed);
Cara lainnya adalah dengan menggunakan functors atau lambda expressions:
connect(sender, &QObject::destroyed, this, [=](){ this->m_objects.remove(sender); });
Signals dan Slots dengan Default Arguments
Signals dan slots juga dapat memiliki argument dengan nilai default. Contohnya, signal destroyed()
dari QObject
dapat memungkinkan kita untuk memberikan argumen dengan nilai default:
void destroyed(QObject* = nullptr);
Slot yang sesuai untuk signal tersebut dapat memiliki argumen dengan nama yang sama dan nilai default yang sama:
void objectDestroyed(QObject* obj = nullptr);
Menghubungkan Signals dan Slots
Signals dan slots dapat dihubungkan menggunakan fungsi QObject::connect()
. Fungsi ini memerlukan beberapa parameter, seperti sender, signal, receiver, dan slot. Contohnya:
connect(sender, &QObject::destroyed, this, &MyObject::objectDestroyed);
Fungsi QObject::connect()
juga dapat digunakan dengan functors atau lambda expressions.
Ketentuan Advanced Signals dan Slots
Qt juga menyediakan beberapa fitur advanced signals dan slots. Salah satu contohnya adalah fungsi QObject::sender()
, yang memungkinkan kita untuk mendapatkan referensi ke objek yang mengirimkan signal:
QAction* sender = QObject::sender();
Menggunakan Qt dengan Signals dan Slots 3rd Party
Qt dapat digunakan dengan signal/slot mechanism yang ditawarkan oleh library ketiga. Untuk melakukan ini, kita perlu menulis beberapa baris kode dalam file CMake project:
target_compile_definitions(my_app PRIVATE QT_NO_KEYWORDS)
Dalam file qmake project (.pro), kita perlu menulis:
QT += no_keywords
Signals dan Slots dalam Qt-based Libraries
Api publik dari library Qt-based sebaiknya menggunakan kata kunci Q_SIGNALS
dan Q_SLOTS
daripada signals dan slots. Karena itu, library creator dapat mengatur preprocessor define QT_NO_SIGNALS_SLOTS_KEYWORDS
ketika membangun library.
Dengan demikian, aplikasi yang ingin menggunakan library tersebut harus menggunakan kata kunci Qt-specific seperti Q_SIGNALS
dan Q_SLOTS
.