Evgenii Legotckoi
Ақп. 26, 2018, 1:07 Т.Қ.

Qt/C++ - Сабақ 075. Шамадан тыс жүктелген сигналдар мен слоттар үшін Qt 5.7 және одан жоғары сигналдар мен ұяшықтардың синтаксисін жақсарту

Qt-де әртүрлі сыныптарда шамадан тыс жүктемесі бар бірнеше сигналдар мен ұяшықтар бар, сондықтан белгілі бір сигналды немесе ұяшықты көрсету үшін static_cast жасау қажет болғанда жазу қосылымдары өте қорқынышты болып көрінеді.

Сонымен, Qt-де QOverload үлгі әдістері немесе qOverload макросы арқылы мұндай шамадан тыс жүктемелерді оңайлатылған жазу мүмкіндігі бар.

qOverload және QOverload арасындағы негізгі айырмашылық мынада: макрос үшін C++ 14 нұсқасы қажет, ал үлгі үшін C++ 11 нұсқасы қажет.


Бұл мысал болып шықты

  1. struct Foo {
  2. void overloadedFunction();
  3. void overloadedFunction(int, QString);
  4. };
  5.  
  6. // требует C++14
  7. qOverload<>(&Foo:overloadedFunction)
  8. qOverload<int, QString>(&Foo:overloadedFunction)
  9.  
  10. // тоже, с C++11
  11. QOverload<>::of(&Foo:overloadedFunction)
  12. QOverload<int, QString>::of(&Foo:overloadedFunction)

QOverload бар сигналдар мен ұяшықтар үшін жазба келесідей болады (QComboBox құжаттамасындағы мысал)

  1. connect(comboBox, QOverload<const QString &>::of(&QComboBox::activated),
  2. [=](const QString &text){ /* ... */ });

Келісемін, сигналдар мен слоттар бойынша алдыңғы сабақтағы нәрсеге қарағанда түсіну оңайырақ болады.

  1. connect(m_testClass, static_cast<void(TestClass::*)(int)>(&TestClass::testSignal), this, static_cast<void(Widget::*)(int)>(&Widget::onTestSlot));

QOverload көмегімен осы мысалды қайта жазайық

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

Пікірлер

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