Connecting Overloaded Signals and Slots in Qt 5
When attempting to connect overloaded signals and slots in Qt 5 using the pointer-to-member function syntax, developers may encounter compilation errors. To rectify this issue, one must understand the problem and apply the appropriate solution.
The Problem of Overloaded Signals and Slots
Overloaded signals and slots, such as QSpinBox::valueChanged(int) and QSpinBox::valueChanged(QString), can cause confusion when connecting them. The issue arises when attempting to connect to a signal without explicitly specifying which overload to use.
Solution for Qt 5.7 and Later
From Qt 5.7 onwards, Qt provides helper functions to select the desired signal overload. To specify an overloaded signal, use the qOverload function as follows:
connect(spinBox, qOverload<int>(&QSpinBox::valueChanged), slider, &QSlider::setValue);
Solution for Qt 5.6 and Earlier
For versions earlier than Qt 5.7, explicitly cast the signal to the correct type using static_cast:
connect(spinBox, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged), slider, &QSlider::setValue);
Ugly Workaround
While effective, the static_cast approach is far from elegant. Consider using the following C 11 snippet instead:
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 Helper Functions
Qt 5.7 introduced helper functions to streamline the process. The primary helper is qOverload, with additional options such as qConstOverload and qNonConstOverload.
Documentation Note
In Qt 5.7 and later, the documentation for overloaded signals explicitly provides examples of how to connect to each overload using helper functions. Refer to the documentation for specific guidance.
The above is the detailed content of How to Connect Overloaded Signals and Slots in Qt 5?. For more information, please follow other related articles on the PHP Chinese website!