O problema aqui é que existem dois sinais com esse nome: QSpinBox::valueChanged(int)
e QSpinBox::valueChanged(QString)
. No Qt 5.7, existem funções auxiliares para selecionar a sobrecarga desejada, para que você possa escrever
connect(spinbox, qOverload<int>(&QSpinBox::valueChanged),
slider, &QSlider::setValue);
Para o Qt 5.6 e versões anteriores, você precisa dizer ao Qt qual deseja escolher, convertendo-o para o tipo certo:
connect(spinbox, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged),
slider, &QSlider::setValue);
Eu sei, é feio . Mas não há maneira de contornar isso. A lição de hoje é: não sobrecarregue seus sinais e slots!
Adendo : o que é realmente irritante no elenco é que
- um repete o nome da classe duas vezes
- é preciso especificar o valor de retorno, mesmo que seja normalmente
void
(para sinais).
Então, às vezes, eu me encontrei usando esse trecho do 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), ...)
Pessoalmente, acho que não é realmente útil. Espero que esse problema desapareça quando o Creator (ou seu IDE) inserir automaticamente a conversão correta ao concluir automaticamente a operação de tirar o PMF. Mas enquanto isso ...
Nota: a sintaxe de conexão baseada em PMF não requer C ++ 11 !
Adendo 2 : no Qt 5.7, foram adicionadas funções auxiliares para atenuar isso, modeladas após a minha solução alternativa acima. O ajudante principal é qOverload
(você também tem qConstOverload
e qNonConstOverload
).
Exemplo de uso (dos 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)
Adendo 3 : se você olhar para a documentação de qualquer sinal de sobrecarga, agora a solução para o problema de sobrecarga está claramente definida nos próprios documentos. Por exemplo, https://doc.qt.io/qt-5/qspinbox.html#valueChanged-1 diz
Nota: O sinal valueChanged está sobrecarregado nesta classe. Para conectar-se a este sinal usando a sintaxe do ponteiro de função, o Qt fornece um auxiliar conveniente para obter o ponteiro de função, conforme mostrado neste exemplo:
connect(spinBox, QOverload<const QString &>::of(&QSpinBox::valueChanged),
[=](const QString &text){ /* ... */ });