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
DDDasal
2024-12-15 16:19:15156semak imbas

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));

kepada:

QObject::connect(spinBox, &QSpinBox::valueChanged,
                 slider, &QSlider::setValue);

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);

Untuk Qt 5.6 dan lebih awal:

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

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

Qt 5.7 Penolong Fungsi:

qOverload<>(&amp;Foo:overloadedFunction)
qOverload<int, QString>(&amp;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!

Kenyataan:
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