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. Function with Signals & Slots
Forum Updated to NodeBB v4.3 + New Features

Function with Signals & Slots

Scheduled Pinned Locked Moved Solved General and Desktop
functionsignal & slot
38 Posts 6 Posters 10.3k Views 4 Watching
  • 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.
  • mrjjM Offline
    mrjjM Offline
    mrjj
    Lifetime Qt Champion
    wrote on last edited by mrjj
    #2

    hi
    You connect directly the button clicked to the slot findimage
    so there is no way to return anything to the button. (the caller)

    You should let the slot call findimage, not be the slot.

    so
    connect (Image_Button,SIGNAL(clicked(bool)),this,SLOT(SetMyStyle(bool)));

    void GetImage::SetMyStyle(bool) {
    QString img=findimage(false);
    .... rest of code
    }

    1 Reply Last reply
    0
    • J Offline
      J Offline
      JordanHarris
      wrote on last edited by JordanHarris
      #3

      You could do as the above comment says, or you could just use the new signal and slot syntax and use a lambda as the "slot". In the lambda you could just call that function and store the results, or use them with something else. For instance:

      connect(imageButton, &QPushButton::clicked, [this]() { imagePath = findImage(); });
      

      If it's something simple as the code above, I prefer to just use lambdas. Either way, I really prefer the newer syntax anyways.

      1 Reply Last reply
      1
      • G gabor53

        Hi,

        I have the following code:

        connect (Image_Button,SIGNAL(clicked(bool)),this,SLOT(findimage(bool)));
        
               qDebug() <<"The image path is (in main): " << fileName;
        
        QString Additem::findimage(bool)
        {
            qDebug()    << "Find image signal works!";
            Image_Button->setStyleSheet ("QPushButton{"
                                         "background-color:rgb(76, 255, 190);"
                                         "border-style: outset;"
                                         "border-width: 2px;"
                                         "border-radius: 10px;"
                                         "border-color: beige;"
                                         "font: bold 14px;"
                                         "min-width: 10em;"
                                         "padding: 6px;}"
        
                                         );
        
        
            QString sPath = "C:/";
        
            QFileDialog *fileDialog = new QFileDialog;
        
            fileName = fileDialog->getOpenFileName(this,
                tr("Finding Friend's Image"),sPath, tr("Image Files (*.png *.jpg *.bmp)"));
        
        	qDebug() << "(findimage) The image path is " << fileName;
        
            return(fileName);
        

        How can I use the returned function value (fileName) in the line following the

        connect (Image_Button,SIGNAL(clicked(bool)),this,SLOT(findimage(bool)));
        

        line?
        Thank you for your help.

        jsulmJ Online
        jsulmJ Online
        jsulm
        Lifetime Qt Champion
        wrote on last edited by
        #4

        @gabor53 You should read again about Qt signals/slots. They are used for asynchronous communication and to react on user interactions. That means if you connect the clicked() signal of a button to a slot that slot will be called when user presses the button. You cannot know when it will happen (for sure not just after connect(...))! So, your current approach does not make any sense.
        You could use another signal and pass the path to the image file as parameter. Then connect a slot to this signal and do what ever you need to do with the image. Or you do everything in findimage().

        https://forum.qt.io/topic/113070/qt-code-of-conduct

        1 Reply Last reply
        0
        • L Offline
          L Offline
          Lineaxe
          wrote on last edited by
          #5

          Hi , try this , I think it will handle what you want , use either the A) or B) lines of code depending on your need.

          Qstring m_fileName; // A) in the header for the class

          // inside function
          Qstring tempFileName; // B) at top of function containing following line
          tempFileName =findimage(bool); // A) use this if you don't care about the filename after the function is completed
          m_fileName=findimage(bool);// B) use this if you want the filename global (and possibly used by other classes)
          tempFileName =connect (Image_Button,SIGNAL(clicked(bool)),this,SLOT( m_fileName)); // or B) tempFileName
          // now use the values m_fileName or tempFileName // the m_fileName is global and can be used in other class functions

          jsulmJ 2 Replies Last reply
          0
          • L Offline
            L Offline
            Lineaxe
            wrote on last edited by
            #6

            Actually I should say it is global to the other class functions , a member variable to be precise, which as class scope, as opposed to a variable that has File scope. Bear with me, I am just going back to c++ and I have to jog my memory a bit...

            1 Reply Last reply
            0
            • L Lineaxe

              Hi , try this , I think it will handle what you want , use either the A) or B) lines of code depending on your need.

              Qstring m_fileName; // A) in the header for the class

              // inside function
              Qstring tempFileName; // B) at top of function containing following line
              tempFileName =findimage(bool); // A) use this if you don't care about the filename after the function is completed
              m_fileName=findimage(bool);// B) use this if you want the filename global (and possibly used by other classes)
              tempFileName =connect (Image_Button,SIGNAL(clicked(bool)),this,SLOT( m_fileName)); // or B) tempFileName
              // now use the values m_fileName or tempFileName // the m_fileName is global and can be used in other class functions

              jsulmJ Online
              jsulmJ Online
              jsulm
              Lifetime Qt Champion
              wrote on last edited by
              #7

              @Lineaxe What is this?

              tempFileName =connect (Image_Button,SIGNAL(clicked(bool)),this,SLOT( m_fileName));
              

              connect(...) does not call the slot, it returns a bool signalling whether signal was connected to the slot or not. So your code will not even compile.

              https://forum.qt.io/topic/113070/qt-code-of-conduct

              1 Reply Last reply
              0
              • L Lineaxe

                Hi , try this , I think it will handle what you want , use either the A) or B) lines of code depending on your need.

                Qstring m_fileName; // A) in the header for the class

                // inside function
                Qstring tempFileName; // B) at top of function containing following line
                tempFileName =findimage(bool); // A) use this if you don't care about the filename after the function is completed
                m_fileName=findimage(bool);// B) use this if you want the filename global (and possibly used by other classes)
                tempFileName =connect (Image_Button,SIGNAL(clicked(bool)),this,SLOT( m_fileName)); // or B) tempFileName
                // now use the values m_fileName or tempFileName // the m_fileName is global and can be used in other class functions

                jsulmJ Online
                jsulmJ Online
                jsulm
                Lifetime Qt Champion
                wrote on last edited by
                #8

                @Lineaxe And you cannot connect a signal to a variable! You can only connect a signal to a slot.

                https://forum.qt.io/topic/113070/qt-code-of-conduct

                1 Reply Last reply
                0
                • L Offline
                  L Offline
                  Lineaxe
                  wrote on last edited by
                  #9

                  right , I should have taken the tempFileName= out , it isn't even needed ...Hmm , looking over a code a bit closer

                  QString Additem::findimage(bool)

                  return(fileName);

                  connect (Image_Button,SIGNAL(clicked(bool)),this,SLOT(findimage(bool)));

                  It looks like findimage returns a filename , not a SLOT , so this code would not work. I guess the only way that it could potentially work is if it had a list of slotnames in the QString and it returned them to connect. ( I am really just getting to know the QT environment, as well) . I must say I do like the concept of signals and slots vs events & triggers.

                  1 Reply Last reply
                  0
                  • L Offline
                    L Offline
                    Lineaxe
                    wrote on last edited by
                    #10

                    Now in his original code for the slot he is using (findimage(bool)) , in the function code he can sure fileName is declared either public or private in the class's header ( m_fileName for example ) so that all the Additem's other class functions will have access to it. Get and Set accessor functions are commonly used with class variables (for many reasons I have discovered) .

                    QString Additem::findimage(bool)
                    m_fileName = fileDialog->getOpenFileName(this,
                    tr("Finding Friend's Image"),sPath, tr("Image Files (*.png *.jpg *.bmp)"));

                    return m_fileName;

                    1 Reply Last reply
                    0
                    • jsulmJ Online
                      jsulmJ Online
                      jsulm
                      Lifetime Qt Champion
                      wrote on last edited by
                      #11

                      The thing is:

                      connect (Image_Button,SIGNAL(clicked(bool)),this,SLOT(findimage(bool)));
                      qDebug() <<"The image path is (in main): " << fileName;
                      
                      • it doesn't matter where fileName (or m_fileName) is declared, after the connect(...) call it will not be set yet because the findimage(bool) slot was not yet called. It will be called when the user clicks on the button - and you never know when the user will click the button.

                      https://forum.qt.io/topic/113070/qt-code-of-conduct

                      1 Reply Last reply
                      0
                      • G Offline
                        G Offline
                        gabor53
                        wrote on last edited by
                        #12

                        Thank you all. Now I understand what's wrong. After the user clicks Image_Button, I want to display the image in a grid layout in which the Image_Button is. Is there a way I can go back to the grid layout AFTER the user clicked Image_Button and insert the choosen image next to the button?

                        1 Reply Last reply
                        0
                        • mrjjM Offline
                          mrjjM Offline
                          mrjj
                          Lifetime Qt Champion
                          wrote on last edited by
                          #13

                          Hi if u use @JordanHarris smart version,
                          you could do something like
                          connect(imageButton, &QPushButton::clicked, this {
                          imagePath = findImage();
                          QPixmap pic(imagePath);
                          ui->SomeQLabel->setPixmap(pic);
                          });

                          you must insert the "SomeQLabel" into the layout. (just a normal Qlabel)

                          G 1 Reply Last reply
                          1
                          • mrjjM mrjj

                            Hi if u use @JordanHarris smart version,
                            you could do something like
                            connect(imageButton, &QPushButton::clicked, this {
                            imagePath = findImage();
                            QPixmap pic(imagePath);
                            ui->SomeQLabel->setPixmap(pic);
                            });

                            you must insert the "SomeQLabel" into the layout. (just a normal Qlabel)

                            G Offline
                            G Offline
                            gabor53
                            wrote on last edited by
                            #14

                            @mrjj ,
                            I implemented

                            connect(Image_Button, &QPushButton::clicked, [this]() { imagePath = findimage(); })
                            

                            and I got the following error message:
                            C:\Programming\backup\Folkfriends\additem.cpp:195: error: no match for 'operator=' (operand types are 'QString' and 'void')
                            connect(Image_Button, &QPushButton::clicked, this { imagePath = findimage(); });
                            ^
                            I'm wondering what am I missing.

                            1 Reply Last reply
                            0
                            • mrjjM Offline
                              mrjjM Offline
                              mrjj
                              Lifetime Qt Champion
                              wrote on last edited by
                              #15

                              well basically it says you are doing
                              void = QString
                              so check that findimage returns Qstring and that
                              imagePath is also declared Qstring

                              G 1 Reply Last reply
                              0
                              • mrjjM mrjj

                                well basically it says you are doing
                                void = QString
                                so check that findimage returns Qstring and that
                                imagePath is also declared Qstring

                                G Offline
                                G Offline
                                gabor53
                                wrote on last edited by
                                #16

                                @mrjj
                                I did that. Now it says
                                C:\Programming\backup\Folkfriends\additem.cpp:195: error: expected primary-expression before ')' token
                                connect(Image_Button, &QPushButton::clicked, this { imagePath = findimage(QString); });
                                ^

                                1 Reply Last reply
                                0
                                • mrjjM Offline
                                  mrjjM Offline
                                  mrjj
                                  Lifetime Qt Champion
                                  wrote on last edited by
                                  #17

                                  Does ur compiler support lambdas?
                                  Try with empty { }

                                  connect(Image_Button, &QPushButton::clicked, [this]() {  })
                                  

                                  you need Qt 5.5 and newer compiler.

                                  G 1 Reply Last reply
                                  0
                                  • mrjjM mrjj

                                    Does ur compiler support lambdas?
                                    Try with empty { }

                                    connect(Image_Button, &QPushButton::clicked, [this]() {  })
                                    

                                    you need Qt 5.5 and newer compiler.

                                    G Offline
                                    G Offline
                                    gabor53
                                    wrote on last edited by
                                    #18

                                    @mrjj
                                    How can I find out if it supports lambdas?

                                    mrjjM 1 Reply Last reply
                                    0
                                    • G gabor53

                                      @mrjj
                                      How can I find out if it supports lambdas?

                                      mrjjM Offline
                                      mrjjM Offline
                                      mrjj
                                      Lifetime Qt Champion
                                      wrote on last edited by
                                      #19

                                      @gabor53
                                      well it can then compile the line.
                                      what compiler is it ?
                                      VS or mingw?
                                      and what version?

                                      G 1 Reply Last reply
                                      0
                                      • mrjjM mrjj

                                        @gabor53
                                        well it can then compile the line.
                                        what compiler is it ?
                                        VS or mingw?
                                        and what version?

                                        G Offline
                                        G Offline
                                        gabor53
                                        wrote on last edited by
                                        #20

                                        @mrjj
                                        I have mingw 4.9.2 32 bit

                                        mrjjM 1 Reply Last reply
                                        0
                                        • G gabor53

                                          @mrjj
                                          I have mingw 4.9.2 32 bit

                                          mrjjM Offline
                                          mrjjM Offline
                                          mrjj
                                          Lifetime Qt Champion
                                          wrote on last edited by mrjj
                                          #21

                                          @gabor53
                                          ahh, u might need
                                          CONFIG+=c++11
                                          in your .pro file for it to use c++ 11 :)

                                          G 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