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


  • Qt Champions 2016

    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
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.