В 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, просто беда. Столько функционала не документировано, остаётся только в заголовочники лезть и сверяться с документацией, что там есть, а что нет.