Apabila cuba menyambungkan isyarat dan slot yang terlebih muatan menggunakan sintaks fungsi penuding kepada ahli baharu dalam Qt 5 , sesetengah pengguna menghadapi ralat kompilasi. Artikel ini menangani isu asas dan menyediakan penyelesaian untuk menyelesaikannya.
Dalam contoh yang diberikan, yang melaksanakan sambungan antara isyarat ValueChanged QSpinBox dan slot setValue QSlider, ralat berpunca daripada kewujudan dua isyarat dengan nama yang sama: valueChanged(int) dan valueChanged(QString).
Dari Qt 5.7 dan seterusnya, fungsi pembantu telah diperkenalkan untuk membantu menyelesaikan lebihan beban isyarat. Fungsi-fungsi ini membolehkan untuk menentukan lebihan beban yang dikehendaki. Dalam kes ini, adalah mungkin untuk menggunakan:
connect(spinbox, qOverload<int>(&QSpinBox::valueChanged), slider, &QSlider::setValue);
Untuk versi Qt yang lebih awal, cast eksplisit diperlukan untuk menunjukkan lebihan beban yang diingini:
connect(spinbox, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged), slider, &QSlider::setValue);
Sebelum Qt 5.7, pendekatan alternatif boleh digunakan untuk menghantar ke fungsi yang sesuai penunjuk:
template<typename... Args> struct SELECT { template<typename C, typename R> static constexpr auto OVERLOAD_OF( R (C::*pmf)(Args...) ) -> decltype(pmf) { return pmf; } };
Penggunaan:
connect(spinbox, SELECT<int>::OVERLOAD_OF(&QSpinBox::valueChanged), ...)
Dalam Qt 5.7, fungsi penolong telah ditambah untuk menyelaraskan proses memilih isyarat terbeban. Pembantu utama ialah qOverload (dengan variasi seperti qConstOverload dan qNonConstOverload).
Contoh penggunaan (daripada dokumentasi Qt):
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)
Dalam Qt 5. dan seterusnya, dokumentasi untuk isyarat terlebih beban kini termasuk panduan untuk menyelesaikan isu lebihan isyarat. Sebagai contoh, dokumentasi QSpinBox untuk valueChanged mengesyorkan menggunakan pembantu qOverload, seperti yang ditunjukkan di bawah:
connect(spinBox, QOverload<const QString &>::of(&QSpinBox::valueChanged), [=](const QString &text){ /* ... */ });
Atas ialah kandungan terperinci Bagaimana untuk Menyelesaikan Ralat Kompilasi Qt 5 Apabila Menyambung Isyarat dan Slot Terlebih Beban?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!