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. Signal and slot from other class not working
Forum Updated to NodeBB v4.3 + New Features

Signal and slot from other class not working

Scheduled Pinned Locked Moved Solved General and Desktop
29 Posts 7 Posters 4.4k Views 3 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.
  • Pl45m4P Pl45m4

    @Ucn_ said in Signal and slot from other class not working:

    QObject::connect (upLabText, SIGNAL (SentFromSecondForm() ()), this, SLOT(ReceivedFromSecondForm()));

    From just looking at your code: There's one "()" too much in your connection (signal part).

    Move your class ClickableLabels to its own header file and try again.

    U Offline
    U Offline
    Ucn_
    wrote on last edited by Ucn_
    #3

    @Pl45m4 The "()" was an error while copying, I don't have extra "()" in my actual code. About the QLabel, I click it then emit the signal, where I want to update another QLabel text. The QLabel I click, I promoted because QLabel doesn't have On Clicked attribute. So, I used that custom event for QLabel clicking.

    1 Reply Last reply
    0
    • Christian EhrlicherC Offline
      Christian EhrlicherC Offline
      Christian Ehrlicher
      Lifetime Qt Champion
      wrote on last edited by Christian Ehrlicher
      #4

      QObject::connect() returns a boolean to indicate if the connect was successful. Also during runtime you will get a warning when the connect is not valid. To avoid this we suggest to use the new signal slot syntax.
      Do you actually see your debug output from ClickableLabels::mousePressEvent() ? I would guess no. At least not from the one you create to do the connection from since this is not the one from the ui file...

      Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
      Visit the Qt Academy at https://academy.qt.io/catalog

      1 Reply Last reply
      1
      • U Offline
        U Offline
        Ucn_
        wrote on last edited by
        #5

        The signal and slot connection I commented on the main.cpp fires, but it does not update the Qlabel and it does not emit on button click.

        Christian EhrlicherC 1 Reply Last reply
        0
        • U Ucn_

          The signal and slot connection I commented on the main.cpp fires, but it does not update the Qlabel and it does not emit on button click.

          Christian EhrlicherC Offline
          Christian EhrlicherC Offline
          Christian Ehrlicher
          Lifetime Qt Champion
          wrote on last edited by
          #6

          @Ucn_ But your current code can not work as I already explained - you are connecting to another instance of ClickableLabels than the one you're displaying.

          Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
          Visit the Qt Academy at https://academy.qt.io/catalog

          U 1 Reply Last reply
          0
          • Christian EhrlicherC Christian Ehrlicher

            @Ucn_ But your current code can not work as I already explained - you are connecting to another instance of ClickableLabels than the one you're displaying.

            U Offline
            U Offline
            Ucn_
            wrote on last edited by
            #7

            @Christian-Ehrlicher I would like to emit from the ClickableLabels class. How do I achieve that? I'm kind of lost.

            Cobra91151C 1 Reply Last reply
            0
            • U Ucn_

              @Christian-Ehrlicher I would like to emit from the ClickableLabels class. How do I achieve that? I'm kind of lost.

              Cobra91151C Offline
              Cobra91151C Offline
              Cobra91151
              wrote on last edited by Cobra91151
              #8

              @Ucn_

              Hello!

              I have created a simple example to illustrate a clickable label, button and connect using lambdas, so you can simplify your code.

              clickablelabel.h

              #ifndef CLICKABLELABEL_H
              #define CLICKABLELABEL_H
              
              #include <QWidget>
              #include <QLabel>
              #include <QEvent>
              
              class ClickableLabel : public QLabel
              {
                  Q_OBJECT
              public:
                  using QLabel::QLabel;
              
              signals:
                  void clicked();
              
              protected:
                  void mousePressEvent(QMouseEvent *event) override;
              };
              
              #endif // CLICKABLELABEL_H
              

              clickablelabel.cpp

              #include "clickablelabel.h"
              
              void ClickableLabel::mousePressEvent(QMouseEvent *event)
              {
                  emit clicked();
                  QLabel::mousePressEvent(event);
              }
              

              test.h

              #ifndef TEST_H
              #define TEST_H
              
              #include <QDialog>
              #include <QVBoxLayout>
              #include "clickablelabel.h"
              
              namespace Ui {
              class Test;
              }
              
              class Test : public QDialog
              {
                  Q_OBJECT
              
              public:
                  explicit Test(QWidget *parent = nullptr);
                  ~Test();
              
              private:
                  Ui::Test *ui;
              };
              
              #endif // TEST_H
              

              test.cpp

              #include "test.h"
              #include "ui_test.h"
              
              Test::Test(QWidget *parent) :
                  QDialog(parent),
                  ui(new Ui::Test)
              {
                  ui->setupUi(this);
                  setFixedSize(600, 500);
                  setWindowFlags(Qt::Dialog | Qt::WindowMinimizeButtonHint | Qt::WindowCloseButtonHint);
                  ClickableLabel *testLabel = new ClickableLabel("This is a test label...", this);
                  connect(testLabel, &ClickableLabel::clicked, [testLabel]() {
                     testLabel->setText("Some text from mouse click");
                  });
                  ui->pushButton->setText("Test button");
                  connect(ui->pushButton, &QPushButton::clicked, [testLabel]() {
                     testLabel->setText("Some text from button click");
                  });
              
                  QVBoxLayout *testLayout = new QVBoxLayout();
                  testLayout->setAlignment(Qt::AlignCenter);
                  testLayout->addWidget(testLabel);
                  testLayout->addWidget(ui->pushButton);
                  setLayout(testLayout);
              }
              
              Test::~Test()
              {
                  delete ui;
              }
              

              Screenshot:

              ClickableLabel.gif

              Happy coding!

              U 2 Replies Last reply
              4
              • Cobra91151C Cobra91151

                @Ucn_

                Hello!

                I have created a simple example to illustrate a clickable label, button and connect using lambdas, so you can simplify your code.

                clickablelabel.h

                #ifndef CLICKABLELABEL_H
                #define CLICKABLELABEL_H
                
                #include <QWidget>
                #include <QLabel>
                #include <QEvent>
                
                class ClickableLabel : public QLabel
                {
                    Q_OBJECT
                public:
                    using QLabel::QLabel;
                
                signals:
                    void clicked();
                
                protected:
                    void mousePressEvent(QMouseEvent *event) override;
                };
                
                #endif // CLICKABLELABEL_H
                

                clickablelabel.cpp

                #include "clickablelabel.h"
                
                void ClickableLabel::mousePressEvent(QMouseEvent *event)
                {
                    emit clicked();
                    QLabel::mousePressEvent(event);
                }
                

                test.h

                #ifndef TEST_H
                #define TEST_H
                
                #include <QDialog>
                #include <QVBoxLayout>
                #include "clickablelabel.h"
                
                namespace Ui {
                class Test;
                }
                
                class Test : public QDialog
                {
                    Q_OBJECT
                
                public:
                    explicit Test(QWidget *parent = nullptr);
                    ~Test();
                
                private:
                    Ui::Test *ui;
                };
                
                #endif // TEST_H
                

                test.cpp

                #include "test.h"
                #include "ui_test.h"
                
                Test::Test(QWidget *parent) :
                    QDialog(parent),
                    ui(new Ui::Test)
                {
                    ui->setupUi(this);
                    setFixedSize(600, 500);
                    setWindowFlags(Qt::Dialog | Qt::WindowMinimizeButtonHint | Qt::WindowCloseButtonHint);
                    ClickableLabel *testLabel = new ClickableLabel("This is a test label...", this);
                    connect(testLabel, &ClickableLabel::clicked, [testLabel]() {
                       testLabel->setText("Some text from mouse click");
                    });
                    ui->pushButton->setText("Test button");
                    connect(ui->pushButton, &QPushButton::clicked, [testLabel]() {
                       testLabel->setText("Some text from button click");
                    });
                
                    QVBoxLayout *testLayout = new QVBoxLayout();
                    testLayout->setAlignment(Qt::AlignCenter);
                    testLayout->addWidget(testLabel);
                    testLayout->addWidget(ui->pushButton);
                    setLayout(testLayout);
                }
                
                Test::~Test()
                {
                    delete ui;
                }
                

                Screenshot:

                ClickableLabel.gif

                Happy coding!

                U Offline
                U Offline
                Ucn_
                wrote on last edited by Ucn_
                #9

                @Cobra91151 Thanks, I will give it a try.

                1 Reply Last reply
                0
                • Cobra91151C Cobra91151

                  @Ucn_

                  Hello!

                  I have created a simple example to illustrate a clickable label, button and connect using lambdas, so you can simplify your code.

                  clickablelabel.h

                  #ifndef CLICKABLELABEL_H
                  #define CLICKABLELABEL_H
                  
                  #include <QWidget>
                  #include <QLabel>
                  #include <QEvent>
                  
                  class ClickableLabel : public QLabel
                  {
                      Q_OBJECT
                  public:
                      using QLabel::QLabel;
                  
                  signals:
                      void clicked();
                  
                  protected:
                      void mousePressEvent(QMouseEvent *event) override;
                  };
                  
                  #endif // CLICKABLELABEL_H
                  

                  clickablelabel.cpp

                  #include "clickablelabel.h"
                  
                  void ClickableLabel::mousePressEvent(QMouseEvent *event)
                  {
                      emit clicked();
                      QLabel::mousePressEvent(event);
                  }
                  

                  test.h

                  #ifndef TEST_H
                  #define TEST_H
                  
                  #include <QDialog>
                  #include <QVBoxLayout>
                  #include "clickablelabel.h"
                  
                  namespace Ui {
                  class Test;
                  }
                  
                  class Test : public QDialog
                  {
                      Q_OBJECT
                  
                  public:
                      explicit Test(QWidget *parent = nullptr);
                      ~Test();
                  
                  private:
                      Ui::Test *ui;
                  };
                  
                  #endif // TEST_H
                  

                  test.cpp

                  #include "test.h"
                  #include "ui_test.h"
                  
                  Test::Test(QWidget *parent) :
                      QDialog(parent),
                      ui(new Ui::Test)
                  {
                      ui->setupUi(this);
                      setFixedSize(600, 500);
                      setWindowFlags(Qt::Dialog | Qt::WindowMinimizeButtonHint | Qt::WindowCloseButtonHint);
                      ClickableLabel *testLabel = new ClickableLabel("This is a test label...", this);
                      connect(testLabel, &ClickableLabel::clicked, [testLabel]() {
                         testLabel->setText("Some text from mouse click");
                      });
                      ui->pushButton->setText("Test button");
                      connect(ui->pushButton, &QPushButton::clicked, [testLabel]() {
                         testLabel->setText("Some text from button click");
                      });
                  
                      QVBoxLayout *testLayout = new QVBoxLayout();
                      testLayout->setAlignment(Qt::AlignCenter);
                      testLayout->addWidget(testLabel);
                      testLayout->addWidget(ui->pushButton);
                      setLayout(testLayout);
                  }
                  
                  Test::~Test()
                  {
                      delete ui;
                  }
                  

                  Screenshot:

                  ClickableLabel.gif

                  Happy coding!

                  U Offline
                  U Offline
                  Ucn_
                  wrote on last edited by Ucn_
                  #10

                  @Cobra91151 said in Signal and slot from other class not working:

                  connect(ui->pushButton, &QPushButton::clicked, testLabel {
                  testLabel->setText("Some text from button click");
                  });

                  The example works, thank. But, is there a way I can pass functions or widgets created in designer to the lambda capture list? Let's say I want to run a function after QLabel click or change a specific label.

                  mrjjM 1 Reply Last reply
                  0
                  • U Ucn_

                    @Cobra91151 said in Signal and slot from other class not working:

                    connect(ui->pushButton, &QPushButton::clicked, testLabel {
                    testLabel->setText("Some text from button click");
                    });

                    The example works, thank. But, is there a way I can pass functions or widgets created in designer to the lambda capture list? Let's say I want to run a function after QLabel click or change a specific label.

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

                    @Ucn_

                    Hi
                    You can capture "this" to allow to use both
                    UI->xxx and member functions

                     connect(ui->pushButton, &QPushButton::clicked, [this]() {
                        ui->xxxxx;
                        });
                    
                    U 1 Reply Last reply
                    4
                    • mrjjM mrjj

                      @Ucn_

                      Hi
                      You can capture "this" to allow to use both
                      UI->xxx and member functions

                       connect(ui->pushButton, &QPushButton::clicked, [this]() {
                          ui->xxxxx;
                          });
                      
                      U Offline
                      U Offline
                      Ucn_
                      wrote on last edited by
                      #12

                      @mrjj Thanks, It works. however, I don't understand why it works in one example and in the other says

                      'QMetaObject::Connection QObject::connect(const QObject *,const char *,const char *,Qt::ConnectionType) const': cannot convert argument 1 from 'QLabel *' to 'const ClickableLabels *'
                      
                      1 Reply Last reply
                      0
                      • SGaistS Offline
                        SGaistS Offline
                        SGaist
                        Lifetime Qt Champion
                        wrote on last edited by
                        #13

                        Because you are using a pointer to a QLabel as first parameter and a signal from your ClickableLabel as second parameter.

                        Interested in AI ? www.idiap.ch
                        Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                        U 1 Reply Last reply
                        2
                        • SGaistS SGaist

                          Because you are using a pointer to a QLabel as first parameter and a signal from your ClickableLabel as second parameter.

                          U Offline
                          U Offline
                          Ucn_
                          wrote on last edited by
                          #14

                          @SGaist what is the viable solution. Cast?

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

                            Ensure your original parameter is a ClickableLabel instance.

                            Interested in AI ? www.idiap.ch
                            Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                            U 1 Reply Last reply
                            1
                            • SGaistS SGaist

                              Ensure your original parameter is a ClickableLabel instance.

                              U Offline
                              U Offline
                              Ucn_
                              wrote on last edited by
                              #16

                              @SGaist Thanks, I promoted QLabel widget in designer to ClickableLabel and it's working. Is it the correct way?

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

                                Since you are using Designer, yes.

                                Interested in AI ? www.idiap.ch
                                Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                                U 1 Reply Last reply
                                1
                                • SGaistS SGaist

                                  Since you are using Designer, yes.

                                  U Offline
                                  U Offline
                                  Ucn_
                                  wrote on last edited by
                                  #18

                                  @SGaist Thanks.

                                  1 Reply Last reply
                                  0
                                  • U Offline
                                    U Offline
                                    Ucn_
                                    wrote on last edited by Ucn_
                                    #19

                                    I know I marked this as solved, and thanks to everyone who helped me understand what I was missing. I'm able to make it work when is widget to widget or promoted with with custom events. However when there is nothing triggered or clicked like a button I'm not able to connect. For example. Function to function, if one function from another class is executed, connect and execute another function in another class. Where the signal is the first executed function and slot is the function executed after the first was triggered. Thanks

                                    Pl45m4P 1 Reply Last reply
                                    0
                                    • U Ucn_

                                      I know I marked this as solved, and thanks to everyone who helped me understand what I was missing. I'm able to make it work when is widget to widget or promoted with with custom events. However when there is nothing triggered or clicked like a button I'm not able to connect. For example. Function to function, if one function from another class is executed, connect and execute another function in another class. Where the signal is the first executed function and slot is the function executed after the first was triggered. Thanks

                                      Pl45m4P Offline
                                      Pl45m4P Offline
                                      Pl45m4
                                      wrote on last edited by
                                      #20

                                      @Ucn_

                                      Set up the connect in your constructor and emit the signal, you connect to, in your function A to execute function B in your second class.


                                      If debugging is the process of removing software bugs, then programming must be the process of putting them in.

                                      ~E. W. Dijkstra

                                      U 1 Reply Last reply
                                      0
                                      • Pl45m4P Pl45m4

                                        @Ucn_

                                        Set up the connect in your constructor and emit the signal, you connect to, in your function A to execute function B in your second class.

                                        U Offline
                                        U Offline
                                        Ucn_
                                        wrote on last edited by
                                        #21

                                        @Pl45m4

                                        This only works when I setup in main.cpp and when it fires in won't update anything in the function except print. When I set up in the constructor and place the emit in the function it does not fire,

                                        QObject::connect(&timer, SIGNAL(printPerSecond()), &w, SLOT(anotherFuncion()));
                                        
                                        emit printPerSecond()
                                        
                                        jsulmJ 1 Reply Last reply
                                        0
                                        • U Ucn_

                                          @Pl45m4

                                          This only works when I setup in main.cpp and when it fires in won't update anything in the function except print. When I set up in the constructor and place the emit in the function it does not fire,

                                          QObject::connect(&timer, SIGNAL(printPerSecond()), &w, SLOT(anotherFuncion()));
                                          
                                          emit printPerSecond()
                                          
                                          jsulmJ Offline
                                          jsulmJ Offline
                                          jsulm
                                          Lifetime Qt Champion
                                          wrote on last edited by
                                          #22

                                          @Ucn_ What is timer in your connect?
                                          Is there a warning at runtime that connect failed?
                                          You should use the new connect syntax to get compiler error instead of runtime warning if your connect call is wrong.

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

                                          U 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