Pytanie o Sloty - podstawy
-
Witam
Pytanie z tych naiwnych i irytujących. Proszę o wyrozumiałość.
Jaka jest różnica między slotem a metodą w klasie.connect(ui->comboBox,SIGNAL(currentTextChanged(QString)),this,SLOT(refresh()));
ta linijka kodu w zależności, gdzie umieszczę funkcję refresh() w pliku nagłówkowym
private slots: działa
private: nie działa
Czy to tylko jedyna różnica? -
Witam
Pytanie z tych naiwnych i irytujących. Proszę o wyrozumiałość.
Jaka jest różnica między slotem a metodą w klasie.connect(ui->comboBox,SIGNAL(currentTextChanged(QString)),this,SLOT(refresh()));
ta linijka kodu w zależności, gdzie umieszczę funkcję refresh() w pliku nagłówkowym
private slots: działa
private: nie działa
Czy to tylko jedyna różnica?@karlowic W skrócie - tak.
Zadeklarowanie metody jako slot mówi Qt, że dana metoda może być podłączona do sygnału.
Oczywiście, żeby układ sygnał-slot działał konieczne jest makroQ_OBJECT
w danej klasie.
Lektura: https://doc.qt.io/qt-5/metaobjects.htmlJedna uwaga: używasz mocno przestarzałej składni co może prowadzić do trudnych do wyłapania błędów.
Nowa składnia:connect(ui->comboBox,&QComboBox::currentTextChanged,this,&klasa::refresh);
Lektura: https://doc.qt.io/qt-5/signalsandslots.html -
Tak jak napisał @artwaw zadeklarowanie metody jako slot dodaje ją do meta opisu klasy jako slot.
Jeśli chodzi o
connect
, to metoda nie musi być slotem, żeby dało się ją podłączyć. Używając składni ze wskaźnikami do funkcji możesz do sygnału podłączyć dowolną metodę czy lambdę. Używając starej składni z makramiSIGNAL
/SLOT
metoda musi być slotem, ponieważ dopasowanie odbywa się po stringach opisujących sygnał/slot w meta opisie klasy.Warto też dodać, że ponieważ można łączyć nie tylko sloty, to do sygnałów można podpinać też inne sygnały, używając którejkolwiek ze składni. Można to wykorzystywać do tworzenia łańcuchów wywołań.
To czy metoda jest slotem czy nie nie wpływa jedynie na możliwą składnię connecta. Ponieważ zadeklarowanie metody jako slot dodaje ją do meta opisu klasy to można taki slot wykorzystać w wielu jej metodach takich jak
QMetaObject::connectSlotsByName
czyQMetaObject::indexOfSlot
. Sloty są również wywoływalne z QML, bez konieczności używania makraQ_INVOKABLE
.