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