Evgenii Legotckoi
Ақп. 26, 2018, 1: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, 2:02 Т.Қ.

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

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

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

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

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

Evgenii Legotckoi
  • Ақп. 22, 2019, 2:11 Т.Қ.

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

Пікірлер

Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
Кіріңіз немесе Тіркеліңіз