Qt 5 memperkenalkan sintaks slot isyarat baharu menggunakan penunjuk kepada fungsi ahli, bertujuan untuk meningkatkan kebolehbacaan dan kebolehlanjutan. Walau bagaimanapun, ia memberikan cabaran apabila menyambung kepada isyarat terlampau beban.
Dalam percubaan untuk mengemas kini kod menggunakan sintaks baharu, daripada:
QObject::connect(spinBox, SIGNAL(valueChanged(int)), slider, SLOT(setValue(int));
kepada:
QObject::connect(spinBox, &QSpinBox::valueChanged, slider, &QSlider::setValue);
ralat penyusunan berlaku disebabkan oleh fungsi beban berlebihan yang tidak dapat diselesaikan isu.
Isu ini berpunca daripada kewujudan dua isyarat terlebih muatan bernama QSpinBox::valueChanged(int) dan QSpinBox::valueChanged(QString). Qt menyediakan fungsi pembantu untuk menyelesaikan lebihan beban ini.
Untuk Qt 5.7 dan lebih baru:
connect(spinbox, qOverload<int>(&QSpinBox::valueChanged), slider, &QSlider::setValue);
Untuk Qt 5.6 dan lebih awal:
connect(spinbox, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged), slider, &QSlider::setValue);
Pemutus eksplisit ini, walaupun menyusahkan, diperlukan untuk menentukan yang dikehendaki isyarat. Adalah dinasihatkan untuk mengelakkan isyarat dan slot yang berlebihan.
C 11 Penyelesaian:
template<typename... Args> struct SELECT { template<typename C, typename R> static constexpr auto OVERLOAD_OF( R (C::*pmf)(Args...) ) -> decltype(pmf) { return pmf; } };
connect(spinbox, SELECT<int>::OVERLOAD_OF(&QSpinBox::valueChanged), ...)
Qt 5.7 Penolong Fungsi:
qOverload<>(&Foo:overloadedFunction) qOverload<int, QString>(&Foo:overloadedFunction)
Rujuk dokumentasi Qt untuk mendapatkan maklumat terkini tentang pengendalian isyarat dan slot terlampau beban.
Atas ialah kandungan terperinci Bagaimana untuk Menyelesaikan Sambungan Slot Isyarat Terlalu Beban dalam Qt 5?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!