Rumah > pembangunan bahagian belakang > C++ > Bagaimana untuk Menyelesaikan Ralat Kompilasi Qt 5 Apabila Menyambung Isyarat dan Slot Terlebih Beban?

Bagaimana untuk Menyelesaikan Ralat Kompilasi Qt 5 Apabila Menyambung Isyarat dan Slot Terlebih Beban?

Susan Sarandon
Lepaskan: 2024-12-09 18:52:15
asal
527 orang telah melayarinya

How to Resolve Qt 5 Compilation Errors When Connecting Overloaded Signals and Slots?

Menyelesaikan Isu Ketersambungan dengan Isyarat dan Slot Terlebih Beban dalam Qt 5

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

Mengatasi Lebihan Pemuatan Isu

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

Untuk versi Qt yang lebih awal, cast eksplisit diperlukan untuk menunjukkan lebihan beban yang diingini:

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

Alternatif untuk Versi Qt Terdahulu

Sebelum Qt 5.7, pendekatan alternatif boleh digunakan untuk menghantar ke fungsi yang sesuai penunjuk:

  • C 11 Snippet: Metafungsi templat ini memperoleh penunjuk fungsi yang diingini:
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

Penggunaan:

connect(spinbox, SELECT<int>::OVERLOAD_OF(&amp;QSpinBox::valueChanged), ...)
Salin selepas log masuk

Qt 5.7 Penambahbaikan

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

// same, with C++11
QOverload<>::of(&amp;Foo:overloadedFunction)
QOverload<int, QString>::of(&amp;Foo:overloadedFunction)
Salin selepas log masuk

Signal Overload Documentation

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 &amp;>::of(&amp;QSpinBox::valueChanged),
[=](const QString &amp;text){ /* ... */ });
Salin selepas log masuk

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!

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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan