Qt Forum

    • Login
    • Search
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Groups
    • Search
    • Unsolved

    Solved Pytanie o Sloty - podstawy

    Polish
    3
    3
    451
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • K
      karlowic last edited by

      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?

      artwaw 1 Reply Last reply Reply Quote 0
      • artwaw
        artwaw @karlowic last edited by

        @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

        For more information please re-read.

        Kind Regards,
        Artur

        1 Reply Last reply Reply Quote 1
        • Chris Kawa
          Chris Kawa Moderators last edited by Chris Kawa

          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.

          1 Reply Last reply Reply Quote 1
          • First post
            Last post