El problema aquí es que hay dos señales con ese nombre: QSpinBox::valueChanged(int)
y QSpinBox::valueChanged(QString)
. Desde Qt 5.7, se proporcionan funciones auxiliares para seleccionar la sobrecarga deseada, para que pueda escribir
connect(spinbox, qOverload<int>(&QSpinBox::valueChanged),
slider, &QSlider::setValue);
Para Qt 5.6 y anteriores, debe decirle a Qt cuál desea elegir, lanzándolo al tipo correcto:
connect(spinbox, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged),
slider, &QSlider::setValue);
Lo sé, es feo . Pero no hay forma de evitar esto. La lección de hoy es: ¡no sobrecargue sus señales y ranuras!
Anexo : lo realmente molesto del elenco es que
- uno repite el nombre de la clase dos veces
- uno tiene que especificar el valor de retorno incluso si es generalmente
void
(para señales).
Así que a veces me encuentro usando este fragmento de C ++ 11:
template<typename... Args> struct SELECT {
template<typename C, typename R>
static constexpr auto OVERLOAD_OF( R (C::*pmf)(Args...) ) -> decltype(pmf) {
return pmf;
}
};
Uso:
connect(spinbox, SELECT<int>::OVERLOAD_OF(&QSpinBox::valueChanged), ...)
Personalmente, no me parece realmente útil. Espero que este problema desaparezca por sí solo cuando Creator (o su IDE) inserte automáticamente el yeso correcto al completar automáticamente la operación de tomar el PMF. Pero mientras tanto ...
Nota: ¡la sintaxis de conexión basada en PMF no requiere C ++ 11 !
Anexo 2 : en Qt 5.7, se agregaron funciones auxiliares para mitigar esto, siguiendo el modelo de mi solución anterior. El ayudante principal es qOverload
(también tienes qConstOverload
y qNonConstOverload
).
Ejemplo de uso (de los documentos):
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)
Anexo 3 : si observa la documentación de cualquier señal sobrecargada, ahora la solución al problema de sobrecarga se indica claramente en los propios documentos. Por ejemplo, https://doc.qt.io/qt-5/qspinbox.html#valueChanged-1 dice
Nota: Signal valueChanged está sobrecargado en esta clase. Para conectarse a esta señal utilizando la sintaxis del puntero de función, Qt proporciona una ayuda conveniente para obtener el puntero de función como se muestra en este ejemplo:
connect(spinBox, QOverload<const QString &>::of(&QSpinBox::valueChanged),
[=](const QString &text){ /* ... */ });