Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. connect (): how to pass a parameter to the function
Forum Updated to NodeBB v4.3 + New Features

connect (): how to pass a parameter to the function

Scheduled Pinned Locked Moved Unsolved General and Desktop
17 Posts 3 Posters 3.7k Views
  • 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.
  • A Offline
    A Offline
    Alby
    wrote on last edited by Alby
    #1

    I have a program with an array with 9 buttons,

    I need to link them to a function [check (int idCell)], but I also need to pass a parameter to the function for work it, I have already tried this (it doesn't work):

    QSignalMapper* signalMapper = new QSignalMapper (this) ;
    
    for(i = 0; i < 9; i++)
    {
        connect(buttons[i], SIGNAL (clicked()), signalMapper, SLOT (map()));
    
        signalMapper->setMapping(buttons[i], i);
    
        connect(signalMapper, SIGNAL(mapped(int)), this, SLOT(check(int)));
    }
    

    and this too (it doesn't work):

      for(i = 0; i < 9; i++)
     {
        connect(buttons[i],  &QAction::triggered, this, [this]{ check(1); });
    }
    

    help.

    J.HilkJ KroMignonK 2 Replies Last reply
    0
    • A Alby

      I have a program with an array with 9 buttons,

      I need to link them to a function [check (int idCell)], but I also need to pass a parameter to the function for work it, I have already tried this (it doesn't work):

      QSignalMapper* signalMapper = new QSignalMapper (this) ;
      
      for(i = 0; i < 9; i++)
      {
          connect(buttons[i], SIGNAL (clicked()), signalMapper, SLOT (map()));
      
          signalMapper->setMapping(buttons[i], i);
      
          connect(signalMapper, SIGNAL(mapped(int)), this, SLOT(check(int)));
      }
      

      and this too (it doesn't work):

        for(i = 0; i < 9; i++)
       {
          connect(buttons[i],  &QAction::triggered, this, [this]{ check(1); });
      }
      

      help.

      J.HilkJ Offline
      J.HilkJ Offline
      J.Hilk
      Moderators
      wrote on last edited by
      #2

      @Alby it doesn't work, isn't really an adequate error description.

      Anyway I assume this would do what you want it to:

      for(i = 0; i < 9; i++)
       {
          connect(buttons[i],  &QAction::triggered, this, [=]()->void{ check(i); }); // = -> we capture everything by copy, that includes the value of I during the creation of this connect
      }
      

      Be aware of the Qt Code of Conduct, when posting : https://forum.qt.io/topic/113070/qt-code-of-conduct


      Q: What's that?
      A: It's blue light.
      Q: What does it do?
      A: It turns blue.

      A 1 Reply Last reply
      1
      • J.HilkJ J.Hilk

        @Alby it doesn't work, isn't really an adequate error description.

        Anyway I assume this would do what you want it to:

        for(i = 0; i < 9; i++)
         {
            connect(buttons[i],  &QAction::triggered, this, [=]()->void{ check(i); }); // = -> we capture everything by copy, that includes the value of I during the creation of this connect
        }
        
        A Offline
        A Offline
        Alby
        wrote on last edited by
        #3

        @J-Hilk Unfortunately it gives me the following error:

        error: no matching member function for call to 'connect'

        I forgot to tell you that I run that piece of code inside the builder of a class, if it can help you i can send you all the code

        J.HilkJ 1 Reply Last reply
        0
        • A Alby

          @J-Hilk Unfortunately it gives me the following error:

          error: no matching member function for call to 'connect'

          I forgot to tell you that I run that piece of code inside the builder of a class, if it can help you i can send you all the code

          J.HilkJ Offline
          J.HilkJ Offline
          J.Hilk
          Moderators
          wrote on last edited by
          #4

          @Alby what exactly is the type of buttons ?


          Be aware of the Qt Code of Conduct, when posting : https://forum.qt.io/topic/113070/qt-code-of-conduct


          Q: What's that?
          A: It's blue light.
          Q: What does it do?
          A: It turns blue.

          A 1 Reply Last reply
          0
          • J.HilkJ J.Hilk

            @Alby what exactly is the type of buttons ?

            A Offline
            A Offline
            Alby
            wrote on last edited by
            #5

            @J-Hilk It is QPushButton

            J.HilkJ 1 Reply Last reply
            0
            • A Alby

              @J-Hilk It is QPushButton

              J.HilkJ Offline
              J.HilkJ Offline
              J.Hilk
              Moderators
              wrote on last edited by
              #6

              @Alby said in connect (): how to pass a parameter to the function:

              @J-Hilk It is QPushButton

              well, no.
              But I assume the pointers stored in the list/vector/array are of type QPushButton*

              for(i = 0; i < 9; i++)
               {
                  connect(buttons[i],  &QPushButton::clicked, this, [=]()->void{ check(i); }); // = -> we capture everything by copy, that includes the value of I during the creation of this connect
              }
              

              Be aware of the Qt Code of Conduct, when posting : https://forum.qt.io/topic/113070/qt-code-of-conduct


              Q: What's that?
              A: It's blue light.
              Q: What does it do?
              A: It turns blue.

              A 1 Reply Last reply
              2
              • A Alby

                I have a program with an array with 9 buttons,

                I need to link them to a function [check (int idCell)], but I also need to pass a parameter to the function for work it, I have already tried this (it doesn't work):

                QSignalMapper* signalMapper = new QSignalMapper (this) ;
                
                for(i = 0; i < 9; i++)
                {
                    connect(buttons[i], SIGNAL (clicked()), signalMapper, SLOT (map()));
                
                    signalMapper->setMapping(buttons[i], i);
                
                    connect(signalMapper, SIGNAL(mapped(int)), this, SLOT(check(int)));
                }
                

                and this too (it doesn't work):

                  for(i = 0; i < 9; i++)
                 {
                    connect(buttons[i],  &QAction::triggered, this, [this]{ check(1); });
                }
                

                help.

                KroMignonK Offline
                KroMignonK Offline
                KroMignon
                wrote on last edited by
                #7

                @Alby said in connect (): how to pass a parameter to the function:

                connect(buttons[i], &QAction::triggered, this, [this]{ check(1); });

                This cannot work, because you have to specify valid lambda function, you have forgotten the parenthesis.

                For example, this should work:

                 for(i = 0; i < 9; i++)
                 {
                    // capture this and i in lambda to be able to use it
                    connect(buttons[i],  &QAction::triggered, this, [this, i](){ 
                       check(i); 
                    });
                }
                

                It is an old maxim of mine that when you have excluded the impossible, whatever remains, however improbable, must be the truth. (Sherlock Holmes)

                1 Reply Last reply
                0
                • J.HilkJ J.Hilk

                  @Alby said in connect (): how to pass a parameter to the function:

                  @J-Hilk It is QPushButton

                  well, no.
                  But I assume the pointers stored in the list/vector/array are of type QPushButton*

                  for(i = 0; i < 9; i++)
                   {
                      connect(buttons[i],  &QPushButton::clicked, this, [=]()->void{ check(i); }); // = -> we capture everything by copy, that includes the value of I during the creation of this connect
                  }
                  
                  A Offline
                  A Offline
                  Alby
                  wrote on last edited by
                  #8

                  @J-Hilk Yes, I was wrong I meant * QPushButton.

                  I tried your solution, first with the buttons inside the array, it didn't work, so I tried to create a separate button:

                    QPushButton * btn = new QPushButton ();
                  

                  I set its geometry and created a connection:

                   connect (btn, & QPushButton :: clicked, this, [=] () -> void {check (i);});
                  

                  With this button, your solution works.

                  So the problem is the button array, which doesn't work, how do I fix it?

                  Other information:

                  the array is instantiated in the class's .h file, like so:

                  QPushButton * buttons [9];
                  

                  and then in the .ccp file, in a method of the same class, I did this:

                  for (i = 0; i <9; i ++)
                  {
                      for (y = 0; y <= height * 2; y = y + height)
                      {
                          for (x = 0; x <= width * 2; x = x + width)
                          {
                              buttons [i] = new QPushButton (grill);
                              buttons [i] -> setObjectName ("cell" + QString :: number (i));
                              buttons [i] -> setGeometry (x, y, width, height);
                          }
                     }
                  }
                  

                  In addition I forgot to mention that the buttons be inside a QFrame as you can see from the code above, I don't know if the QFrame can be the cause of the problem.

                  The QFrame is always instantiated in the .h file of the class, like this:

                  QFrame * grill = new QFrame ();
                  
                  J.HilkJ KroMignonK 2 Replies Last reply
                  0
                  • A Alby

                    @J-Hilk Yes, I was wrong I meant * QPushButton.

                    I tried your solution, first with the buttons inside the array, it didn't work, so I tried to create a separate button:

                      QPushButton * btn = new QPushButton ();
                    

                    I set its geometry and created a connection:

                     connect (btn, & QPushButton :: clicked, this, [=] () -> void {check (i);});
                    

                    With this button, your solution works.

                    So the problem is the button array, which doesn't work, how do I fix it?

                    Other information:

                    the array is instantiated in the class's .h file, like so:

                    QPushButton * buttons [9];
                    

                    and then in the .ccp file, in a method of the same class, I did this:

                    for (i = 0; i <9; i ++)
                    {
                        for (y = 0; y <= height * 2; y = y + height)
                        {
                            for (x = 0; x <= width * 2; x = x + width)
                            {
                                buttons [i] = new QPushButton (grill);
                                buttons [i] -> setObjectName ("cell" + QString :: number (i));
                                buttons [i] -> setGeometry (x, y, width, height);
                            }
                       }
                    }
                    

                    In addition I forgot to mention that the buttons be inside a QFrame as you can see from the code above, I don't know if the QFrame can be the cause of the problem.

                    The QFrame is always instantiated in the .h file of the class, like this:

                    QFrame * grill = new QFrame ();
                    
                    J.HilkJ Offline
                    J.HilkJ Offline
                    J.Hilk
                    Moderators
                    wrote on last edited by J.Hilk
                    #9

                    @Alby said in connect (): how to pass a parameter to the function:

                    I tried your solution, first with the buttons inside the array, it didn't work

                    again, it didn't work is not a sufficient error description.
                    Whats the compiler error?

                    So the problem is the button array, which doesn't work, how do I fix it?

                    it should work with or without the array, important is only the pointer to the object instance.

                    just in case:
                    you can do the following:

                    for (i = 0; i <9; i ++)
                    {
                        for (y = 0; y <= height * 2; y = y + height)
                        {
                            for (x = 0; x <= width * 2; x = x + width)
                            {
                                auto btn = new QPushButton (grill);
                                connect (btn, & QPushButton :: clicked, this, [=] () -> void {check (i);});
                                buttons [i] = btn
                                buttons [i] -> setObjectName ("cell" + QString :: number (i));
                                buttons [i] -> setGeometry (x, y, width, height);
                            }
                       }
                    }
                    

                    if that doesn't work either, than you're probably mixing your buttons up, and are actually not pressing, the button you're think you're pressing.


                    Never mind, reading is a virtue.
                    see @KroMignon 's post, you need to bring your loops into order.


                    Be aware of the Qt Code of Conduct, when posting : https://forum.qt.io/topic/113070/qt-code-of-conduct


                    Q: What's that?
                    A: It's blue light.
                    Q: What does it do?
                    A: It turns blue.

                    1 Reply Last reply
                    2
                    • A Alby

                      @J-Hilk Yes, I was wrong I meant * QPushButton.

                      I tried your solution, first with the buttons inside the array, it didn't work, so I tried to create a separate button:

                        QPushButton * btn = new QPushButton ();
                      

                      I set its geometry and created a connection:

                       connect (btn, & QPushButton :: clicked, this, [=] () -> void {check (i);});
                      

                      With this button, your solution works.

                      So the problem is the button array, which doesn't work, how do I fix it?

                      Other information:

                      the array is instantiated in the class's .h file, like so:

                      QPushButton * buttons [9];
                      

                      and then in the .ccp file, in a method of the same class, I did this:

                      for (i = 0; i <9; i ++)
                      {
                          for (y = 0; y <= height * 2; y = y + height)
                          {
                              for (x = 0; x <= width * 2; x = x + width)
                              {
                                  buttons [i] = new QPushButton (grill);
                                  buttons [i] -> setObjectName ("cell" + QString :: number (i));
                                  buttons [i] -> setGeometry (x, y, width, height);
                              }
                         }
                      }
                      

                      In addition I forgot to mention that the buttons be inside a QFrame as you can see from the code above, I don't know if the QFrame can be the cause of the problem.

                      The QFrame is always instantiated in the .h file of the class, like this:

                      QFrame * grill = new QFrame ();
                      
                      KroMignonK Offline
                      KroMignonK Offline
                      KroMignon
                      wrote on last edited by
                      #10

                      @Alby said in connect (): how to pass a parameter to the function:

                      for (i = 0; i <9; i ++)
                      {
                         for (y = 0; y <= height * 2; y = y + height)
                         {
                             for (x = 0; x <= width * 2; x = x + width)
                             {
                                 buttons [i] = new QPushButton (grill);
                                 buttons [i] -> setObjectName ("cell" + QString :: number (i));
                                 buttons [i] -> setGeometry (x, y, width, height);
                             }
                        }
                      }
                      

                      What are you doing here?!?
                      This don't make sense to me.
                      Are you aware that you will only have in buttons[] the last QPushButton (with highest X and Y values). All other instance references are lost.

                      It is an old maxim of mine that when you have excluded the impossible, whatever remains, however improbable, must be the truth. (Sherlock Holmes)

                      A 1 Reply Last reply
                      3
                      • KroMignonK KroMignon

                        @Alby said in connect (): how to pass a parameter to the function:

                        for (i = 0; i <9; i ++)
                        {
                           for (y = 0; y <= height * 2; y = y + height)
                           {
                               for (x = 0; x <= width * 2; x = x + width)
                               {
                                   buttons [i] = new QPushButton (grill);
                                   buttons [i] -> setObjectName ("cell" + QString :: number (i));
                                   buttons [i] -> setGeometry (x, y, width, height);
                               }
                          }
                        }
                        

                        What are you doing here?!?
                        This don't make sense to me.
                        Are you aware that you will only have in buttons[] the last QPushButton (with highest X and Y values). All other instance references are lost.

                        A Offline
                        A Offline
                        Alby
                        wrote on last edited by
                        #11

                        @KroMignon I am creating a small game (tick-tack-toe), those loops I need to create the grid of buttons, where players enter X or 0

                        I honestly did not know, I thought that inside the array, I inserted the various instances of the buttons, without losing them.

                        But then how do I create a series of buttons inside an array, without losing the various references to the instance.

                        KroMignonK J.HilkJ 2 Replies Last reply
                        0
                        • A Alby

                          @KroMignon I am creating a small game (tick-tack-toe), those loops I need to create the grid of buttons, where players enter X or 0

                          I honestly did not know, I thought that inside the array, I inserted the various instances of the buttons, without losing them.

                          But then how do I create a series of buttons inside an array, without losing the various references to the instance.

                          KroMignonK Offline
                          KroMignonK Offline
                          KroMignon
                          wrote on last edited by
                          #12

                          @Alby said in connect (): how to pass a parameter to the function:

                          I am creating a small game (tick-tack-toe), those loops I need to create the grid of buttons, where players enter X or 0
                          I honestly did not know, I thought that inside the array, I inserted the various instances of the buttons, without losing them.
                          But then how do I create a series of buttons inside an array, without losing the various references to the instance.

                          Why do you have 3 loop?
                          I can understand loop over x and y to build the matrix, but why i?

                          It is an old maxim of mine that when you have excluded the impossible, whatever remains, however improbable, must be the truth. (Sherlock Holmes)

                          A 1 Reply Last reply
                          0
                          • A Alby

                            @KroMignon I am creating a small game (tick-tack-toe), those loops I need to create the grid of buttons, where players enter X or 0

                            I honestly did not know, I thought that inside the array, I inserted the various instances of the buttons, without losing them.

                            But then how do I create a series of buttons inside an array, without losing the various references to the instance.

                            J.HilkJ Offline
                            J.HilkJ Offline
                            J.Hilk
                            Moderators
                            wrote on last edited by J.Hilk
                            #13

                            @Alby

                            int main(int argc, char *argv[])
                            {
                                QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
                                QApplication app(argc, argv);
                            
                                QWidget frame;
                                frame.resize(600,600);
                                const int col = 3;
                                const int row = 3;
                                const int width = frame.width() / col;
                                const int height = frame.width() / row;
                            
                                QList<QPushButton*> buttons;
                            
                                auto check = [](int i)->void{qDebug() << i;};
                            
                                int i{0};
                                for(int y{0}; y < row; y++){
                                    for(int x{0}; x < col; x++){
                                        auto btn = new QPushButton(&frame);
                                        btn->setGeometry(x * width, y *height, width, height);
                                        QObject::connect(btn, &QPushButton::clicked, [=]()->void{check(i);});
                                        buttons.append(btn);
                                        i++;
                                    }
                                }
                                frame.show();
                            
                                return app.exec();
                            }
                            

                            you should seriously consider using a QGridLayout for this.


                            Be aware of the Qt Code of Conduct, when posting : https://forum.qt.io/topic/113070/qt-code-of-conduct


                            Q: What's that?
                            A: It's blue light.
                            Q: What does it do?
                            A: It turns blue.

                            A 1 Reply Last reply
                            0
                            • KroMignonK KroMignon

                              @Alby said in connect (): how to pass a parameter to the function:

                              I am creating a small game (tick-tack-toe), those loops I need to create the grid of buttons, where players enter X or 0
                              I honestly did not know, I thought that inside the array, I inserted the various instances of the buttons, without losing them.
                              But then how do I create a series of buttons inside an array, without losing the various references to the instance.

                              Why do you have 3 loop?
                              I can understand loop over x and y to build the matrix, but why i?

                              A Offline
                              A Offline
                              Alby
                              wrote on last edited by
                              #14

                              @KroMignon I realized it now, sorry I was wrong that cycle is not needed

                              1 Reply Last reply
                              0
                              • J.HilkJ J.Hilk

                                @Alby

                                int main(int argc, char *argv[])
                                {
                                    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
                                    QApplication app(argc, argv);
                                
                                    QWidget frame;
                                    frame.resize(600,600);
                                    const int col = 3;
                                    const int row = 3;
                                    const int width = frame.width() / col;
                                    const int height = frame.width() / row;
                                
                                    QList<QPushButton*> buttons;
                                
                                    auto check = [](int i)->void{qDebug() << i;};
                                
                                    int i{0};
                                    for(int y{0}; y < row; y++){
                                        for(int x{0}; x < col; x++){
                                            auto btn = new QPushButton(&frame);
                                            btn->setGeometry(x * width, y *height, width, height);
                                            QObject::connect(btn, &QPushButton::clicked, [=]()->void{check(i);});
                                            buttons.append(btn);
                                            i++;
                                        }
                                    }
                                    frame.show();
                                
                                    return app.exec();
                                }
                                

                                you should seriously consider using a QGridLayout for this.

                                A Offline
                                A Offline
                                Alby
                                wrote on last edited by
                                #15

                                @J-Hilk

                                I will try to use QGridLayout, the last things () about your code:

                                • What is 'auto'? , in the line:
                                  auto btn = new QPushButton(&frame);

                                • I saw that you make use of this syntax ex: int y {0}, what is it?

                                • What does this mean:
                                  [] (int i) ?
                                  in the line:
                                  auto check = [] (int i) -> void {qDebug () << i;};

                                • What does this mean?:
                                  [=] () -> void
                                  in the line:
                                  QObject :: connect (btn, & QPushButton :: clicked, [=] () -> void {check (i);});

                                Sorry for the many questions I asked, most likely stupid, I'm new to Qt and C ++, in any case thank you very much

                                J.HilkJ 1 Reply Last reply
                                0
                                • A Alby

                                  @J-Hilk

                                  I will try to use QGridLayout, the last things () about your code:

                                  • What is 'auto'? , in the line:
                                    auto btn = new QPushButton(&frame);

                                  • I saw that you make use of this syntax ex: int y {0}, what is it?

                                  • What does this mean:
                                    [] (int i) ?
                                    in the line:
                                    auto check = [] (int i) -> void {qDebug () << i;};

                                  • What does this mean?:
                                    [=] () -> void
                                    in the line:
                                    QObject :: connect (btn, & QPushButton :: clicked, [=] () -> void {check (i);});

                                  Sorry for the many questions I asked, most likely stupid, I'm new to Qt and C ++, in any case thank you very much

                                  J.HilkJ Offline
                                  J.HilkJ Offline
                                  J.Hilk
                                  Moderators
                                  wrote on last edited by
                                  #16

                                  @Alby said in connect (): how to pass a parameter to the function:

                                  Sorry for the many questions I asked, most likely stupid, I'm new to Qt and C ++, in any case thank you very much

                                  don't worry, we all started sometime, somewhere.
                                  That said, starting with Qt and c++ in parallel is a hard path, I did it myself, so it's not impossible :D but be warned.

                                  What is 'auto'?

                                  mmh, if you haven't heard of it, ignore it :P
                                  its a place holder for compile time type deduction...
                                  for more information:
                                  https://en.cppreference.com/w/cpp/keyword/auto

                                  I saw that you make use of this syntax ex: int y {0}, what is it?

                                  it is one of the many, many ways to initialise a variable in c++ and the newest one and the one the c++ committee recommends to use.

                                  What does this mean:
                                  [] (int i) ?
                                  in the line:
                                  auto check = [] (int i) -> void {qDebug () << i;};

                                  its a lambda, in this case an unnamed function inside a function
                                  for more information
                                  https://en.cppreference.com/w/cpp/language/lambda

                                  QObject :: connect (btn, & QPushButton :: clicked, [=] () -> void {check (i);});

                                  an other lambda to call the previous lambda, when the clicked signal is emitted!

                                  🙈


                                  Be aware of the Qt Code of Conduct, when posting : https://forum.qt.io/topic/113070/qt-code-of-conduct


                                  Q: What's that?
                                  A: It's blue light.
                                  Q: What does it do?
                                  A: It turns blue.

                                  A 1 Reply Last reply
                                  2
                                  • J.HilkJ J.Hilk

                                    @Alby said in connect (): how to pass a parameter to the function:

                                    Sorry for the many questions I asked, most likely stupid, I'm new to Qt and C ++, in any case thank you very much

                                    don't worry, we all started sometime, somewhere.
                                    That said, starting with Qt and c++ in parallel is a hard path, I did it myself, so it's not impossible :D but be warned.

                                    What is 'auto'?

                                    mmh, if you haven't heard of it, ignore it :P
                                    its a place holder for compile time type deduction...
                                    for more information:
                                    https://en.cppreference.com/w/cpp/keyword/auto

                                    I saw that you make use of this syntax ex: int y {0}, what is it?

                                    it is one of the many, many ways to initialise a variable in c++ and the newest one and the one the c++ committee recommends to use.

                                    What does this mean:
                                    [] (int i) ?
                                    in the line:
                                    auto check = [] (int i) -> void {qDebug () << i;};

                                    its a lambda, in this case an unnamed function inside a function
                                    for more information
                                    https://en.cppreference.com/w/cpp/language/lambda

                                    QObject :: connect (btn, & QPushButton :: clicked, [=] () -> void {check (i);});

                                    an other lambda to call the previous lambda, when the clicked signal is emitted!

                                    🙈

                                    A Offline
                                    A Offline
                                    Alby
                                    wrote on last edited by
                                    #17

                                    @J-Hilk Thanks very much

                                    1 Reply Last reply
                                    0

                                    • Login

                                    • Login or register to search.
                                    • First post
                                      Last post
                                    0
                                    • Categories
                                    • Recent
                                    • Tags
                                    • Popular
                                    • Users
                                    • Groups
                                    • Search
                                    • Get Qt Extensions
                                    • Unsolved