Rumah > pembangunan bahagian belakang > C++ > Bagaimana untuk Menyelesaikan Sambungan Slot Isyarat Terlalu Beban dalam Qt 5?

Bagaimana untuk Menyelesaikan Sambungan Slot Isyarat Terlalu Beban dalam Qt 5?

DDD
Lepaskan: 2024-12-15 16:19:15
asal
157 orang telah melayarinya

How to Resolve Overloaded Signal-Slot Connections in Qt 5?

Menyelesaikan Sambungan Slot Isyarat Terlebih Beban dalam Qt 5

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.

Isu Terhadap

Dalam percubaan untuk mengemas kini kod menggunakan sintaks baharu, daripada:

QObject::connect(spinBox, SIGNAL(valueChanged(int)),
                 slider, SLOT(setValue(int));
Salin selepas log masuk

kepada:

QObject::connect(spinBox, &QSpinBox::valueChanged,
                 slider, &QSlider::setValue);
Salin selepas log masuk

ralat penyusunan berlaku disebabkan oleh fungsi beban berlebihan yang tidak dapat diselesaikan isu.

Resolusi Isyarat Terlebih Beban

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>(&amp;QSpinBox::valueChanged),
        slider, &amp;QSlider::setValue);
Salin selepas log masuk

Untuk Qt 5.6 dan lebih awal:

connect(spinbox, static_cast<void (QSpinBox::*)(int)>(&amp;QSpinBox::valueChanged),
        slider, &amp;QSlider::setValue);
Salin selepas log masuk

Pemutus eksplisit ini, walaupun menyusahkan, diperlukan untuk menentukan yang dikehendaki isyarat. Adalah dinasihatkan untuk mengelakkan isyarat dan slot yang berlebihan.

Alternatif

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;
    } 
};
Salin selepas log masuk
connect(spinbox, SELECT<int>::OVERLOAD_OF(&amp;QSpinBox::valueChanged), ...)
Salin selepas log masuk

Qt 5.7 Penolong Fungsi:

qOverload<>(&amp;Foo:overloadedFunction)
qOverload<int, QString>(&amp;Foo:overloadedFunction)
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan