Buradaki sorun , bu isimde iki sinyalin olmasıdır: QSpinBox::valueChanged(int)
ve QSpinBox::valueChanged(QString)
. Qt 5.7'den, istenen aşırı yüklemeyi seçmek için sağlanan yardımcı işlevler vardır, böylece yazabilirsiniz
connect(spinbox, qOverload<int>(&QSpinBox::valueChanged),
slider, &QSlider::setValue);
Qt 5.6 ve öncesi için, Qt'ye hangisini seçmek istediğinizi doğru türe çevirerek söylemeniz gerekir:
connect(spinbox, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged),
slider, &QSlider::setValue);
Biliyorum, bu çirkin . Ama bunun etrafında hiçbir yolu yok. Bugünün dersi: sinyallerinizi ve yuvalarınızı aşırı yüklemeyin!
Ek : Oyuncularla ilgili gerçekten sinir bozucu olan şey,
- biri sınıf adını iki kez tekrarlar
- genellikle
void
(sinyaller için) olsa bile dönüş değerini belirtmek zorundadır .
Bu yüzden kendimi bazen bu C ++ 11 pasajını kullanırken buldum:
template<typename... Args> struct SELECT {
template<typename C, typename R>
static constexpr auto OVERLOAD_OF( R (C::*pmf)(Args...) ) -> decltype(pmf) {
return pmf;
}
};
Kullanımı:
connect(spinbox, SELECT<int>::OVERLOAD_OF(&QSpinBox::valueChanged), ...)
Ben şahsen bunu pek yararlı bulmuyorum. Oluşturucu (veya IDE'niz) PMF alma işlemini otomatik olarak tamamlarken doğru atamayı otomatik olarak ekleyeceği zaman bu sorunun kendiliğinden ortadan kalkmasını bekliyorum. Ama bu arada ...
Not: PMF tabanlı bağlantı sözdizimi C ++ 11 gerektirmez !
Ek 2 : Qt 5.7'de, yukarıdaki geçici çözümümden sonra modellenen, bunu azaltmak için yardımcı işlevler eklendi. Ana yardımcısıdır qOverload
(ayrıca var qConstOverload
ve qNonConstOverload
).
Kullanım örneği (dokümanlardan):
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)
Ek 3 : Aşırı yüklenmiş herhangi bir sinyalin belgelerine bakarsanız, artık aşırı yükleme sorununun çözümü belgelerin kendisinde açıkça belirtilmiştir. Örneğin, https://doc.qt.io/qt-5/qspinbox.html#valueChanged-1 diyor ki
Not: Signal valueChanged bu sınıfta aşırı yüklenmiştir. İşlev işaretçisi sözdizimini kullanarak bu sinyale bağlanmak için Qt, bu örnekte gösterildiği gibi işlev işaretçisini elde etmek için uygun bir yardımcı sağlar:
connect(spinBox, QOverload<const QString &>::of(&QSpinBox::valueChanged),
[=](const QString &text){ /* ... */ });