Menggabungkan Signal dan Slot di Qt

Menggabungkan Signal dan Slot di Qt

Di dalam framework Qt, signal dan slot digunakan sebagai cara untuk berkomunikasi antar objek. Signal adalah fungsi yang dipublikasikan oleh sebuah objek, sedangkan slot adalah fungsi yang dituju oleh signal. Pada artikel ini, kita akan membahas bagaimana menggunakan signal dan slot di Qt.

Penggunaan Slot

Slot adalah fungsi yang digunakan untuk mendapatkan informasi tentang perubahan status pada objek lainnya. Contohnya, LCD Number (LcdNumber) memakai slot untuk menampilkan nomor yang dipublikasikan oleh sebuah widget lainnya. Karena display() adalah bagian dari interface antara class dengan program lainnya, maka slot haruslah publik.

Banyak contoh program Qt yang menghubungkan nilai yang berubah pada QScrollBar ke slot display(), sehingga LCD number terus menampilkan nilai scroll bar.

Signal dan Slot dengan Argumen Default

Signatures signal dan slot dapat berisi argumen, dan argumen tersebut dapat memiliki nilai default. Contohnya, QObject::destroyed() memiliki signature sebagai berikut:

void destroyed(QObject* = nullptr);

Pada saat sebuah objek QObject dihapus, maka signel ini dipublikasikan. Kita ingin menangkap signal ini agar kita dapat membersihkan reference yang masih aktif ke objek yang sudah dihapus. Slot yang cocok untuk ini mungkin sebagai berikut:

void objectDestroyed(QObject* obj = nullptr);

Koneksi antara signal dan slot dilakukan menggunakan fungsi QObject::connect(). Ada beberapa cara untuk menghubungkan signal dan slot, seperti menggunakan pointer fungsi:

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

Cara lain adalah menggunakan functor atau lambda C++11:

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

Keduanya memerlukan konteks sebagai parameter ketika menghubungkan signal dan slot. Konteks ini memberikan informasi tentang tipe thread yang harus digunakan untuk menjalankan receiver.

Penggunaan Qt dengan Signal dan Slot Pihak Ketiga

Dapat dipastikan bahwa Qt dapat digunakan bersama-sama dengan signal dan slot dari pihak ketiga. Untuk melakukan hal tersebut, kita perlu menulis:

target_compile_definitions(my_app PRIVATE QT_NO_KEYWORDS)

Pada file CMake project, atau:

QT_NO_KEYWORDS

Pada file qmake project (.pro). Kode-kode tersebut menginstruksikan Qt untuk tidak mendefinisikan kata kunci moc (signals, slots, dan emit), karena nama-nama ini akan digunakan oleh sebuah library pihak ketiga, seperti Boost.

Signal dan Slot pada Library Qt-based

API publik dari library Qt-based seharusnya menggunakan kata kunci Q_SIGNALS dan Q_SLOTS, bukan signals dan slots. Jika tidak, maka akan sulit untuk menggunakan library tersebut dalam proyek yang mendefinisikan QT_NO_KEYWORDS.

Untuk mengatasi masalah ini, pembuat library dapat menulis:

preprocessor define QT_NO_SIGNALS_SLOTS_KEYWORDS

Pada saat membangun library. Definisi ini mengklaim bahwa library tidak menggunakan signal dan slot, tetapi masih dapat menggunakan kata kunci Qt lainnya dalam implementasinya.