Проблема тут полягає в тому, що є два сигнали з таким ім'ям: QSpinBox::valueChanged(int)
і QSpinBox::valueChanged(QString)
. З Qt 5.7 передбачені допоміжні функції для вибору потрібного перевантаження, щоб ви могли писати
connect(spinbox, qOverload<int>(&QSpinBox::valueChanged),
slider, &QSlider::setValue);
Для Qt 5.6 і новіших версій вам потрібно сказати Qt, який ви бажаєте вибрати, переклавши його на потрібний тип:
connect(spinbox, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged),
slider, &QSlider::setValue);
Я знаю, це некрасиво . Але обходу цього немає. Сьогоднішній урок такий: не перевантажуйте свої сигнали та слоти!
Додаток : те, що насправді дратує в ролях, це те
- один повторює назву класу двічі
- треба вказати повернене значення, навіть якщо воно зазвичай
void
(для сигналів).
Тож я іноді опиняюся за допомогою цього фрагмента 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;
}
};
Використання:
connect(spinbox, SELECT<int>::OVERLOAD_OF(&QSpinBox::valueChanged), ...)
Я особисто вважаю це не дуже корисним. Я очікую, що ця проблема сама собою відірветься, коли Creator (або ваш IDE) автоматично вставить правильний склад при автоматичному завершенні операції з прийняття PMF. Але тим часом ...
Примітка: синтаксис з'єднання на основі PMF не вимагає C ++ 11 !
Додаток 2 : у Qt 5.7 для доповнення цього було додано допоміжні функції, зразки мого вирішення вище. Основний помічник - це qOverload
(ви також отримали qConstOverload
і qNonConstOverload
).
Приклад використання (з документів):
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)
Додаток 3 : якщо ви подивитесь на документацію будь-якого перевантаженого сигналу, тепер вирішення проблеми з перевантаженням чітко зазначено в самих документах. Наприклад, https://doc.qt.io/qt-5/qspinbox.html#valueChanged-1 каже
Примітка: Значення сигналу Змінено перевантажено в цьому класі. Для підключення до цього сигналу за допомогою синтаксису вказівника функції Qt надає зручний помічник для отримання вказівника функції, як показано в цьому прикладі:
connect(spinBox, QOverload<const QString &>::of(&QSpinBox::valueChanged),
[=](const QString &text){ /* ... */ });