Qt у різних класів є ряд сигналів і слотів, які мають перевантаження, у зв'язку з чим запис коннектів виглядає просто монструозною, коли для вказівки конкретного сигналу або слота потрібно робити static_cast.
Так ось, Qt присутній функціонал для спрощеного запису таких перевантажень через шаблонні методи QOverload або через макрос qOverload .
Принципове різницю між qOverload і QOverload у тому, що макрос вимагає C++ версії 14, тоді як шаблон вимагає C++ версії 11.
Виходить такий приклад
struct Foo { void overloadedFunction(); void overloadedFunction(int, QString); }; // требует C++14 qOverload<>(&Foo:overloadedFunction) qOverload<int, QString>(&Foo:overloadedFunction) // тоже, с C++11 QOverload<>::of(&Foo:overloadedFunction) QOverload<int, QString>::of(&Foo:overloadedFunction)
Для сигналів і слотів з QOverload запис буде виглядати так (приклад з документації на QComboBox)
connect(comboBox, QOverload<const QString &>::of(&QComboBox::activated), [=](const QString &text){ /* ... */ });
Погодьтеся, це буде набагато простіше для сприйняття, ніж щось таке з попереднього уроку сигналів і слотів
connect(m_testClass, static_cast<void(TestClass::*)(int)>(&TestClass::testSignal), this, static_cast<void(Widget::*)(int)>(&Widget::onTestSlot));
Давайте перепишемо цей приклад із використанням QOverload
connect(m_testClass, QOverload<int>::of(&TestClass::testSignal), this, QOverload<int>::of(&Widget::onTestSlot));
Запис став не лише коротшим, а й більш зрозумілим.
Класс! Улучшил мою кодерскую жизнь :) А как узнал об этом QOverload? Наткнулся изучая доки?)
Ага. Просматривал документацию на QComboBox и наткнулся на обновление записи коннектнов.
Кстати, подпишись и на раздел статей Android, я сейчас пишу серию статей, в которых описываются два варианта примеров:
В документации до сих пор нет отдельного описания.
В документации по многим моментам нет описания, особенно, что касается QQuick, просто беда. Столько функционала не документировано, остаётся только в заголовочники лезть и сверяться с документацией, что там есть, а что нет.