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?



  • @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 makro Q_OBJECT w danej klasie.
    Lektura: https://doc.qt.io/qt-5/metaobjects.html

    Jedna 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


  • Moderators

    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 makrami SIGNAL/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 czy QMetaObject::indexOfSlot. Sloty są również wywoływalne z QML, bez konieczności używania makra Q_INVOKABLE.


Log in to reply