Qt5 ұяшықтары бар сигналдармен жұмыс істеу кезінде жиі кездесетін мәселе, менің форумдағы сұрақтарды бақылауыма сәйкес, көрсеткіштердегі синтаксистегі ұяшықтарды қолтаңбаның шамадан тыс жүктелуі бар сигналдарға қосу. Бұл шамадан тыс жүктелген слоттарға да қатысты.
Сигналдары шамадан тыс жүктелген сынақ сыныбын алайық.
#include <QObject> class TestClass : public QObject { Q_OBJECT public: explicit TestClass(QObject *parent = nullptr); signals: void testSignal(int arg1); void testSignal(int arg1, int arg2); };
Мұнда қолтаңба шамадан тыс жүктелген сигнал бар. Бұл сигнал Виджет сыныбында жарияланған және қолтаңбаның шамадан тыс жүктелуі бар ұяшықтарға да қосылады.
#include <QWidget> #include "testclass.h" namespace Ui { class Widget; } class Widget : public QWidget { Q_OBJECT public: explicit Widget(QWidget *parent = 0); ~Widget(); private slots: void onTestSlot(int arg1); void onTestSlot(int arg1, int arg2); private: Ui::Widget *ui; TestClass* m_testClass; };
4-тоқсандағыдай
Qt4 шеңберінде барлығы сигналдың қолтаңбасын және SIGNAL және SLOT. макростарындағы ұяшықты көрсету арқылы оңай шешілді.
connect(m_testClass, SIGNAL(testSignal(int,int)), this, SLOT(onTestSlot(int,int))); connect(m_testClass, SIGNAL(testSignal(int)), this, SLOT(onTestSlot(int)));
5-тоқсанда болғандай
Бірақ Qt5-те жаңа сигнал мен ұяшық синтаксисінде жазу кезінде кейбір мәселелер туындайды. Өйткені static_cast әдісі қолтаңбаларын жасау қажет болады.
connect(m_testClass, static_cast<void(TestClass::*)(int)>(&TestClass::testSignal), this, static_cast<void(Widget::*)(int)>(&Widget::onTestSlot)); connect(m_testClass, static_cast<void(TestClass::*)(int, int)>(&TestClass::testSignal), this, static_cast<void(Widget::*)(int, int)>(&Widget::onTestSlot));
Айтпақшы, жаңа синтаксис сонымен қатар Qt4-тегідей сигналдарды кішірек қолтаңбасы бар ұяшықтарға қосуға мүмкіндік береді.
connect(m_testClass, static_cast<void(TestClass::*)(int, int)>(&TestClass::testSignal), this, static_cast<void(Widget::*)(int)>(&Widget::onTestSlot));
Жаңа синтаксистің артықшылықтары
Ал енді сүрінді. Неліктен жаңа сигналдар мен слоттар синтаксисін пайдалану керек? Бұл сұрақты әлі де анда-санда естимін. Әсіресе, адамдар қолтаңбалардың осындай қорқынышты касталарын көргенде.
Сонымен, әлеуетті артықшылықтар:
- Орындау уақытында емес, компиляция сатысында сигналдар мен слоттарды қосудағы қателерді қадағалау мүмкіндігі
- Кодтан макростарды жою арқылы компиляция уақытының шығындарын азайту
- Ламбда функцияларын қосу мүмкіндігі, бұл өте маңызды тоқаш
- Жеке ұяшыққа сырттан қосылуға тырысқанда өзімізді қателерден қорғаймыз. Иә!! Иә!! SIGNAL және SLOT макростары OOP бұза отырып, әдіске кіру деңгейлерін елемейді.
Жалпы, бұл мен үшін жеткілікті, ал сіз үшін?
Отличная необходимая статья.