Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

Signals and Slot using Functor



  • Hi ,

    Can anyone explain what is going on this code. How does the Functor class acts as a Slot ?

    Sorry for such a dumb question , Newbie to C++ and Qt.

    class Functor {
    public:
    Functor(Object *object, const QString &str) :
         m_object(object), m_str(str) {}
         void operator()(int x, int y) const {
         m_object->set(x, y, m_str);
    }
    private:
       Object *m_object;
        QString m_str;
    };
        connect(obj1, SIGNAL(coordChanged(int, int)),
        Functor("Some Text"));
    
    

    Thanks.



  • @TopNotch_Mach07 said in Signals and Slot using Functor:

    How does the Functor class acts as a Slot ?

    Hi,
    it's because your connect statement connects to a function of signature (int x, int y) and the class has an operator() of the same signature.
    -Michael.



  • see https://wiki.qt.io/New_Signal_Slot_Syntax

    New: connecting to simple function
    The new syntax can even connect to functions, not just QObjects

    in this case the operator() of the object is treated as a function



  • Your Functor class is not a functor !
    The constructor should only set parameter for the functor function. You must define a functor function in your class.

    Class Functor
    {
    .......................
    Returntype operator()(Argumentlist) { .....; return ....; }
    }

    Functor f(ConstructorArguments);
    auto x=f(FunctorArguments); // here the syntax is like a normal function call


  • Lifetime Qt Champion

    Hi
    If you are new to to c++
    Might be good to know the what functor really means.
    http://www.cprogramming.com/tutorial/functors-function-objects-in-c++.html

    TLDR: Its basically just a function inside a class.
    We pass the class to other class where they expect a function pointer/adress but the magic of "operator ()"
    makes it work as otherwise it would complain about types.


Log in to reply