Evgenii Legotckoi
26 лютого 2018 р. 13:07

Qt/C++ - Підручник 075. Покращення синтаксису сигналів і слотів у Qt 5.7 і вище для перевантажених сигналів і слотів

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));

Запис став не лише коротшим, а й більш зрозумілим.

Вам це подобається? Поділіться в соціальних мережах!

АК
  • 26 лютого 2018 р. 14:02

Класс! Улучшил мою кодерскую жизнь :) А как узнал об этом QOverload? Наткнулся изучая доки?)

Ага. Просматривал документацию на QComboBox и наткнулся на обновление записи коннектнов.

Кстати, подпишись и на раздел статей Android, я сейчас пишу серию статей, в которых описываются два варианта примеров:

  1. Java
  2. Qt QML
Думаю, что тебе интересно будет
D
  • 22 лютого 2019 р. 12:55

В документации до сих пор нет отдельного описания.

Evgenii Legotckoi
  • 22 лютого 2019 р. 14:11

В документации по многим моментам нет описания, особенно, что касается QQuick, просто беда. Столько функционала не документировано, остаётся только в заголовочники лезть и сверяться с документацией, что там есть, а что нет.

Коментарі

Only authorized users can post comments.
Please, Log in or Sign up