Masalahnya di sini adalah bahwa ada dua sinyal dengan nama itu: QSpinBox::valueChanged(int)
dan QSpinBox::valueChanged(QString)
. Dari Qt 5.7, ada fungsi pembantu yang disediakan untuk memilih kelebihan yang diinginkan, sehingga Anda dapat menulis
connect(spinbox, qOverload<int>(&QSpinBox::valueChanged),
slider, &QSlider::setValue);
Untuk Qt 5.6 dan sebelumnya, Anda perlu memberi tahu Qt mana yang ingin Anda pilih, dengan melemparkannya ke jenis yang tepat:
connect(spinbox, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged),
slider, &QSlider::setValue);
Saya tahu, itu jelek . Tapi tidak ada jalan lain untuk ini. Pelajaran hari ini adalah: jangan membebani sinyal dan slot Anda!
Tambahan : apa yang benar-benar mengganggu tentang para pemain adalah itu
- satu mengulangi nama kelas dua kali
- kita harus menentukan nilai kembali bahkan jika biasanya
void
(untuk sinyal).
Jadi saya kadang menemukan diri saya menggunakan cuplikan C ++ 11 ini:
template<typename... Args> struct SELECT {
template<typename C, typename R>
static constexpr auto OVERLOAD_OF( R (C::*pmf)(Args...) ) -> decltype(pmf) {
return pmf;
}
};
Pemakaian:
connect(spinbox, SELECT<int>::OVERLOAD_OF(&QSpinBox::valueChanged), ...)
Saya pribadi merasa itu tidak terlalu berguna. Saya berharap masalah ini hilang dengan sendirinya ketika Creator (atau IDE Anda) akan secara otomatis memasukkan gips yang tepat ketika secara otomatis menyelesaikan operasi pengambilan PMF. Namun sementara itu ...
Catatan: sintaks koneksi berbasis PMF tidak memerlukan C ++ 11 !
Tambahan 2 : dalam Qt 5.7 fungsi pembantu ditambahkan untuk mengurangi ini, dimodelkan setelah solusi saya di atas. Pembantu utama adalah qOverload
(Anda juga punya qConstOverload
danqNonConstOverload
).
Contoh penggunaan (dari dokumen):
struct Foo {
void overloadedFunction();
void overloadedFunction(int, QString);
};
// requires C++14
qOverload<>(&Foo:overloadedFunction)
qOverload<int, QString>(&Foo:overloadedFunction)
// same, with C++11
QOverload<>::of(&Foo:overloadedFunction)
QOverload<int, QString>::of(&Foo:overloadedFunction)
Tambahan 3 : jika Anda melihat dokumentasi dari setiap sinyal kelebihan beban, sekarang solusi untuk masalah kelebihan muatan tersebut dinyatakan dengan jelas dalam dokumen itu sendiri. Misalnya, https://doc.qt.io/qt-5/qspinbox.html#valueChanged-1 kata
Catatan: Nilai sinyal Diubah kelebihan muatan di kelas ini. Untuk menyambung ke sinyal ini dengan menggunakan sintaks penunjuk fungsi, Qt menyediakan penolong yang nyaman untuk mendapatkan penunjuk fungsi seperti yang ditunjukkan dalam contoh ini:
connect(spinBox, QOverload<const QString &>::of(&QSpinBox::valueChanged),
[=](const QString &text){ /* ... */ });