Il problema qui è che ci sono due segnali con quel nome: QSpinBox::valueChanged(int)
e QSpinBox::valueChanged(QString)
. Da Qt 5.7, ci sono funzioni di supporto fornite per selezionare il sovraccarico desiderato, in modo da poter scrivere
connect(spinbox, qOverload<int>(&QSpinBox::valueChanged),
slider, &QSlider::setValue);
Per Qt 5.6 e precedenti, devi dire a Qt quale vuoi scegliere, lanciandolo nel tipo giusto:
connect(spinbox, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged),
slider, &QSlider::setValue);
Lo so, è brutto . Ma non c'è modo di aggirare questo. La lezione di oggi è: non sovraccaricare i tuoi segnali e le tue slot!
Addendum : la cosa veramente fastidiosa del cast è quella
- uno ripete due volte il nome della classe
- bisogna specificare il valore di ritorno anche se di solito
void
(per i segnali).
Quindi a volte mi sono trovato a usare questo frammento di 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 trovo che non sia davvero utile. Mi aspetto che questo problema scompaia da solo quando Creator (o il tuo IDE) inserirà automaticamente il cast giusto quando completerà automaticamente l'operazione di acquisizione del PMF. Ma nel frattempo ...
Nota: la sintassi di connessione basata su PMF non richiede C ++ 11 !
Addendum 2 : in Qt 5.7 sono state aggiunte funzioni di supporto per mitigare questo, modellato sulla mia soluzione alternativa sopra. L'aiutante principale è qOverload
(hai anche qConstOverload
e qNonConstOverload
).
Esempio di utilizzo (dai documenti):
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)
Addendum 3 : se si guarda alla documentazione di qualsiasi segnale sovraccarico, ora la soluzione al problema del sovraccarico è chiaramente indicata nei documenti stessi. Ad esempio, https://doc.qt.io/qt-5/qspinbox.html#valueChanged-1 dice
Nota: il valore del segnale modificato è sovraccarico in questa classe. Per connettersi a questo segnale utilizzando la sintassi del puntatore a funzione, Qt fornisce un aiuto utile per ottenere il puntatore a funzione come mostrato in questo esempio:
connect(spinBox, QOverload<const QString &>::of(&QSpinBox::valueChanged),
[=](const QString &text){ /* ... */ });