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. same signal-slot connection in two windows
Qt 6.11 is out! See what's new in the release blog

same signal-slot connection in two windows

Scheduled Pinned Locked Moved Solved General and Desktop
60 Posts 9 Posters 9.6k 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.
  • R Offline
    R Offline
    russjohn834
    wrote on last edited by russjohn834
    #1

    Hi All,

    I have two windows (QMainWindow), say Settings and Patients.

    There is a signal - slot connection in the Settings as follows:

    connect(&api, SIGNAL(batteryEvent(STIM_GUI_TOPIC_T, uint8_t, uint32_t )), this, SLOT(eventHandler(STIM_GUI_TOPIC_T , uint8_t , uint32_t )));
    
    

    here eventHandler controls an LED battery status button

    In the Settings window this works fine. Now I need to do the same thing on Patients window (controls an LED), Pateints is constructed from Settings. I trie doing the same connection (below) in the Patients window but that seems not working.

    connect(&api, SIGNAL(batteryEvent(STIM_GUI_TOPIC_T, uint8_t, uint32_t )), this, SLOT(eventHandlerTwo(STIM_GUI_TOPIC_T , uint8_t , uint32_t )));
    
    

    Any idea what am I doing wrong here?

    mrjjM Pablo J. RoginaP 2 Replies Last reply
    0
    • R russjohn834

      Hi All,

      I have two windows (QMainWindow), say Settings and Patients.

      There is a signal - slot connection in the Settings as follows:

      connect(&api, SIGNAL(batteryEvent(STIM_GUI_TOPIC_T, uint8_t, uint32_t )), this, SLOT(eventHandler(STIM_GUI_TOPIC_T , uint8_t , uint32_t )));
      
      

      here eventHandler controls an LED battery status button

      In the Settings window this works fine. Now I need to do the same thing on Patients window (controls an LED), Pateints is constructed from Settings. I trie doing the same connection (below) in the Patients window but that seems not working.

      connect(&api, SIGNAL(batteryEvent(STIM_GUI_TOPIC_T, uint8_t, uint32_t )), this, SLOT(eventHandlerTwo(STIM_GUI_TOPIC_T , uint8_t , uint32_t )));
      
      

      Any idea what am I doing wrong here?

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

      @russjohn834
      Hi
      Check if the connect return TRUE
      Also, make sure none of the objects runs out of scope
      I can see you use & on the API class so make sure its not a local variable.

      Also consider using the new connect syntax as that catches more errors
      https://wiki.qt.io/New_Signal_Slot_Syntax

      Also, show the code for the settings things that don't work.
      Classic errors include creating a new instance to connect instead on the one on screen or
      using a local variable that won't live long enough to send any signals.
      But it could also be something else so we need to see the full code for the creation and connection to have
      a chance to say where it went wrong.

      1 Reply Last reply
      3
      • R russjohn834

        Hi All,

        I have two windows (QMainWindow), say Settings and Patients.

        There is a signal - slot connection in the Settings as follows:

        connect(&api, SIGNAL(batteryEvent(STIM_GUI_TOPIC_T, uint8_t, uint32_t )), this, SLOT(eventHandler(STIM_GUI_TOPIC_T , uint8_t , uint32_t )));
        
        

        here eventHandler controls an LED battery status button

        In the Settings window this works fine. Now I need to do the same thing on Patients window (controls an LED), Pateints is constructed from Settings. I trie doing the same connection (below) in the Patients window but that seems not working.

        connect(&api, SIGNAL(batteryEvent(STIM_GUI_TOPIC_T, uint8_t, uint32_t )), this, SLOT(eventHandlerTwo(STIM_GUI_TOPIC_T , uint8_t , uint32_t )));
        
        

        Any idea what am I doing wrong here?

        Pablo J. RoginaP Offline
        Pablo J. RoginaP Offline
        Pablo J. Rogina
        wrote on last edited by Pablo J. Rogina
        #3

        @russjohn834 I wonder if you need a different approach here.
        Are those QMainWindows at the same level? I mean, are they created in some "higher level" container object?
        If so, maybe you need to move the handling of the battery event and LED on/off task there. I'm thinking what will happen if you need to add 2 more windows, are you going to connect the api and LED handling in those new windows as well? and then you're asked to add 2 more windows... it seems not good for app maintenance...

        Upvote the answer(s) that helped you solve the issue
        Use "Topic Tools" button to mark your post as Solved
        Add screenshots via postimage.org
        Don't ask support requests via chat/PM. Please use the forum so others can benefit from the solution in the future

        1 Reply Last reply
        4
        • R Offline
          R Offline
          russjohn834
          wrote on last edited by russjohn834
          #4

          @mrjj @Pablo-J-Rogina Thanks.

          just a quick question, how can I switch following into the new Signal-slot syntax?

            connect(&api, SIGNAL(tetraGripEvent(STIM_GUI_TOPIC_T, uint8_t, uint32_t )), this, SLOT(eventHandler(STIM_GUI_TOPIC_T , uint8_t , uint32_t )));
          
          

          here api is global variable

          Cobra91151C 1 Reply Last reply
          0
          • R russjohn834

            @mrjj @Pablo-J-Rogina Thanks.

            just a quick question, how can I switch following into the new Signal-slot syntax?

              connect(&api, SIGNAL(tetraGripEvent(STIM_GUI_TOPIC_T, uint8_t, uint32_t )), this, SLOT(eventHandler(STIM_GUI_TOPIC_T , uint8_t , uint32_t )));
            
            

            here api is global variable

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

            @russjohn834

            Hello!

            The new Signal-slot syntax will be like this:

            connect(this, &Test::tetraGripEvent, this, &Test::eventHandler);
            

            Note: this is just a test example. Where the Test is your current class and it emitting a signal and receiving it. Also, you can do it using lambda.

            connect(this, &Test::tetraGripEvent, [this](STIM_GUI_TOPIC_T a, uint8_t b, uint32_t c) {
                eventHandler(a, b, c);
            });
            

            You need to provide more info about the api global variable, where and how you have initialized it?

            1 Reply Last reply
            4
            • R Offline
              R Offline
              russjohn834
              wrote on last edited by
              #6

              @Cobra91151 Thank you.

              I define the instance of my API class in the main as follows:

              tetra_grip_api api; ------------>class instance
              
              int main(int argc, char *argv[])
              {
                  QApplication a(argc, argv);
              
                  api.openSerialPort();
                  QObject::connect(api.serial, SIGNAL(readyRead()), &api, SLOT(readData()));
              
                  Settings w(nullptr);
                  w.show();
                  return a.exec();
              }
              
              

              In this case, how do I switch the following expression into the new signal-slot syntax?

              connect(&api, SIGNAL(tetraGripEvent(STIM_GUI_TOPIC_T, uint8_t, uint32_t )), this, SLOT(eventHandlerTwo(STIM_GUI_TOPIC_T , uint8_t , uint32_t )));
              
              1 Reply Last reply
              0
              • J Offline
                J Offline
                jazzco2
                wrote on last edited by
                #7

                If this is of your class Settings the following should work.

                connect(&api, &tetra_grip_api::tetraGripEvent, this, &Settings::eventHandlerTwo);
                

                Otherwise replace the second class by the correct one.

                1 Reply Last reply
                1
                • R Offline
                  R Offline
                  russjohn834
                  wrote on last edited by russjohn834
                  #8

                  @jazzco2 Thanks a lot.

                  The new connect syntax seems ok. It did not complain about anything. But I'm not getting the expected output. Just to summarize.

                  I'm calling QMainWindow Patients from Settings. In the Patients constructor, I did connect as follows:

                  connect(&api, &tetra_grip_api::tetraGripEvent,this, &Patients::eventHandlerTwo);
                  

                  When I put a breakpoint in the connect statement, it did not went into the eventHandlerTwo slot. which means something wrong in the way I did the connection.

                  where api is global variable.

                  eventHandlerTwo is a public slot:

                  void Patients::eventHandlerTwo( STIM_GUI_TOPIC_T topic, uint8_t reg, uint32_t value)
                  {
                      if (topic==TOPIC_STIMULATOR)
                      {
                          switch(reg)
                          {
                          case STIM_REG_BATTERY_CAPACITY_REMAINING:
                  
                              if(value<86)
                                  ui->qLed_p2->setOnColor(QLed::Red);
                              else
                                  ui->qLed_p2->setOnColor(QLed::Green);
                                  ui->qLed_p2->setValue(true);
                              break;
                          }
                      }
                      ui->label_batteryVal->setText(QString::number(value));
                   }
                  
                  

                  Patients being called from Settings as follows:

                  void Settings::on_pushButton_patients_clicked()
                  {
                  
                      hide();
                      stagetwo = new Patients(this);
                      stagetwo -> show();
                  }
                  

                  Any thoughts?

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

                    So where do you call your connect() statement?

                    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
                    0
                    • R russjohn834

                      @jazzco2 Thanks a lot.

                      The new connect syntax seems ok. It did not complain about anything. But I'm not getting the expected output. Just to summarize.

                      I'm calling QMainWindow Patients from Settings. In the Patients constructor, I did connect as follows:

                      connect(&api, &tetra_grip_api::tetraGripEvent,this, &Patients::eventHandlerTwo);
                      

                      When I put a breakpoint in the connect statement, it did not went into the eventHandlerTwo slot. which means something wrong in the way I did the connection.

                      where api is global variable.

                      eventHandlerTwo is a public slot:

                      void Patients::eventHandlerTwo( STIM_GUI_TOPIC_T topic, uint8_t reg, uint32_t value)
                      {
                          if (topic==TOPIC_STIMULATOR)
                          {
                              switch(reg)
                              {
                              case STIM_REG_BATTERY_CAPACITY_REMAINING:
                      
                                  if(value<86)
                                      ui->qLed_p2->setOnColor(QLed::Red);
                                  else
                                      ui->qLed_p2->setOnColor(QLed::Green);
                                      ui->qLed_p2->setValue(true);
                                  break;
                              }
                          }
                          ui->label_batteryVal->setText(QString::number(value));
                       }
                      
                      

                      Patients being called from Settings as follows:

                      void Settings::on_pushButton_patients_clicked()
                      {
                      
                          hide();
                          stagetwo = new Patients(this);
                          stagetwo -> show();
                      }
                      

                      Any thoughts?

                      JonBJ Offline
                      JonBJ Offline
                      JonB
                      wrote on last edited by
                      #10

                      @russjohn834 said in same signal-slot connection in two windows:

                      connect(&api, &tetra_grip_api::tetraGripEvent,this, &Patients::eventHandlerTwo);

                      When I put a breakpoint in the connect statement, it did not went into the eventHandlerTwo slot. which means something wrong in the way I did connection.

                      What do you mean? When the connect statement is executed it will not cause any entry into Patients::eventHandlerTwo, that only comes when the signal is later emitted.

                      R 1 Reply Last reply
                      3
                      • R Offline
                        R Offline
                        russjohn834
                        wrote on last edited by
                        #11

                        @Christian-Ehrlicher

                        Connect is called as in the following:

                        
                        Patients::Patients(QWidget *parent) :
                            QMainWindow(parent),
                            ui(new Ui::Patients)
                        {
                            ui->setupUi(this);
                        
                        
                            this->setStyleSheet("background-color: white;");
                            this->setFixedSize(this->width(),this->height());
                        
                        
                        
                            connect(&api, &tetra_grip_api::tetraGripEvent,this, &Patients::eventHandlerTwo); //--->connect is called here
                            
                        // Setup table
                            ui->tableWidget->setColumnCount(5);
                            ui->tableWidget->setHorizontalHeaderLabels(QStringList{"Patient ID","Name", "Surname", "LastSession", "Note"});
                            ui->tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
                            ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);
                        
                        
                        
                             QString path = QCoreApplication::applicationDirPath()+"/data/";
                        
                        
                        
                            QStringList qdiFilter("*.xml");
                        
                        
                            QDirIterator qdi( path, qdiFilter, QDir::Files);
                            while (qdi.hasNext())
                            {
                                parseDataEntry(qdi.next());
                            }
                        
                        }
                        
                        1 Reply Last reply
                        0
                        • JonBJ JonB

                          @russjohn834 said in same signal-slot connection in two windows:

                          connect(&api, &tetra_grip_api::tetraGripEvent,this, &Patients::eventHandlerTwo);

                          When I put a breakpoint in the connect statement, it did not went into the eventHandlerTwo slot. which means something wrong in the way I did connection.

                          What do you mean? When the connect statement is executed it will not cause any entry into Patients::eventHandlerTwo, that only comes when the signal is later emitted.

                          R Offline
                          R Offline
                          russjohn834
                          wrote on last edited by
                          #12

                          @JonB

                          I'm connecting with the same signal in the previous window , so do I need to disconnect that and connection to use the same signal in with a new slot?

                          Basically in Settings window this works:

                           connect(&api, &tetra_grip_api::tetraGripEvent,this, &Settings::eventHandler); //--> slot is eventHandler
                          

                          But in Patients this is not working:

                             connect(&api, &tetra_grip_api::tetraGripEvent,this, &Patients::eventHandlerTwo);//--->Slot is eventHandlerTwo
                          
                          JonBJ 1 Reply Last reply
                          0
                          • R russjohn834

                            @JonB

                            I'm connecting with the same signal in the previous window , so do I need to disconnect that and connection to use the same signal in with a new slot?

                            Basically in Settings window this works:

                             connect(&api, &tetra_grip_api::tetraGripEvent,this, &Settings::eventHandler); //--> slot is eventHandler
                            

                            But in Patients this is not working:

                               connect(&api, &tetra_grip_api::tetraGripEvent,this, &Patients::eventHandlerTwo);//--->Slot is eventHandlerTwo
                            
                            JonBJ Offline
                            JonBJ Offline
                            JonB
                            wrote on last edited by
                            #13

                            @russjohn834
                            So I now take it you mean you find the slot does not get entered, not the the connect fails?

                            No, you do not have to disconnect, a signal may have any number of slots attached. Though if a previously-attached slot does not return, or misbehaves like if the slot instance is no longer around, it is possible the second slot might not get called.

                            So if debugging what is going you might be advised to temporarily not connect the Settings slot, just the Patients slot and concentrate on sorting that out. It is not possible to say from what you have posted why one slot works and the other does not.

                            1 Reply Last reply
                            1
                            • R Offline
                              R Offline
                              russjohn834
                              wrote on last edited by
                              #14

                              @JonB Thank you. I tried to connect only the Patients slot but cant see where I'm wrong..

                              Patients window is opened from Settings as given below:

                              void Settings::on_pushButton_patients_clicked()
                              {
                              
                                  hide();
                                  stagetwo = new Patients(this);
                                  stagetwo -> show();
                              }
                              

                              Where stagetwo is public

                              public:
                                   Settings(QString,QWidget *parent = nullptr);
                                  ~Settings();
                                   Patients *stagetwo;
                              

                              Anything wrong I'm doing here!?

                              1 Reply Last reply
                              0
                              • R Offline
                                R Offline
                                russjohn834
                                wrote on last edited by
                                #15

                                Hi all,

                                I just noticed this thing if I call both my Settings and Patients from my main the connection is successful (see below)

                                #include <QApplication>
                                
                                tetra_grip_api api;
                                
                                int main(int argc, char *argv[])
                                {
                                    QApplication a(argc, argv);
                                
                                    api.openSerialPort();
                                
                                    QObject::connect(api.serial, SIGNAL(readyRead()), &api, SLOT(readData()));
                                    QObject::connect(api.serial, SIGNAL(error(QSerialPort::SerialPortError)),&api, SLOT(ErrorHandler(QSerialPort::SerialPortError))); // error handling
                                
                                    Settings w(nullptr);
                                    w.show();
                                
                                    Patients v(nullptr); //---------> this makes connection successfull
                                    v.show();
                                
                                    return a.exec();
                                }
                                

                                but instead, if I call Patients from Settings even though the connection is successful im not getting the expected output.

                                My signal source api is a global variable which is initialized in the main as shown above.
                                So constructing both classes in the main makes connection ok and I'm gettting expected output. But if I call one window from other makes connection true but my slot is not being called at all.

                                What is the reason for this?

                                JonBJ 1 Reply Last reply
                                0
                                • R russjohn834

                                  Hi all,

                                  I just noticed this thing if I call both my Settings and Patients from my main the connection is successful (see below)

                                  #include <QApplication>
                                  
                                  tetra_grip_api api;
                                  
                                  int main(int argc, char *argv[])
                                  {
                                      QApplication a(argc, argv);
                                  
                                      api.openSerialPort();
                                  
                                      QObject::connect(api.serial, SIGNAL(readyRead()), &api, SLOT(readData()));
                                      QObject::connect(api.serial, SIGNAL(error(QSerialPort::SerialPortError)),&api, SLOT(ErrorHandler(QSerialPort::SerialPortError))); // error handling
                                  
                                      Settings w(nullptr);
                                      w.show();
                                  
                                      Patients v(nullptr); //---------> this makes connection successfull
                                      v.show();
                                  
                                      return a.exec();
                                  }
                                  

                                  but instead, if I call Patients from Settings even though the connection is successful im not getting the expected output.

                                  My signal source api is a global variable which is initialized in the main as shown above.
                                  So constructing both classes in the main makes connection ok and I'm gettting expected output. But if I call one window from other makes connection true but my slot is not being called at all.

                                  What is the reason for this?

                                  JonBJ Offline
                                  JonBJ Offline
                                  JonB
                                  wrote on last edited by JonB
                                  #16

                                  @russjohn834
                                  If you're asking me to guess, show how you gain access to tetra_grip_api api; from Settings/Patients? In these cases where do you do the connect()s from? And, how do you know your connect()s are successful?

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

                                    Hi,

                                    @russjohn834 said in same signal-slot connection in two windows:

                                    QObject::connect(api.serial, SIGNAL(readyRead()), &api, SLOT(readData()));
                                    QObject::connect(api.serial, SIGNAL(error(QSerialPort::SerialPortError)),&api, SLOT(ErrorHandler(QSerialPort::SerialPortError))); // error handling

                                    Since serial is internal to api why don't you connect it in the constructor of your tetra_grip_api class ?

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

                                    1 Reply Last reply
                                    1
                                    • JonBJ JonB

                                      @russjohn834
                                      If you're asking me to guess, show how you gain access to tetra_grip_api api; from Settings/Patients? In these cases where do you do the connect()s from? And, how do you know your connect()s are successful?

                                      R Offline
                                      R Offline
                                      russjohn834
                                      wrote on last edited by
                                      #18

                                      @JonB

                                      This is how I make the connection in Settings.

                                      Settings::Settings(QString patientLabel, QWidget *parent) : QMainWindow(parent)
                                          , ui(new Ui::Settings)
                                      {
                                          ui->setupUi(this);
                                         
                                          connect(&api, &tetra_grip_api::tetraGripEvent,this, &Settings::eventHandler);
                                      }
                                      

                                      Connection is successfull (qDebug()<<connect(....) gives TRUE) also the a QLabel and an LED in the eventHandler slot works perfectly.

                                      In the same way I try to connect in the Patients:

                                      Patients::Patients(QWidget *parent) : QMainWindow(parent)
                                          , ui(new Ui::Patients)
                                      {
                                          ui->setupUi(this);
                                         
                                          connect(&api, &tetra_grip_api::tetraGripEvent,this, &Patients::eventHandlerTwo);
                                      }
                                      

                                      here connection is successfull (qDebug()<<connect(....) gives TRUE) but the a QLabel and an LED in the eventHandlerTwo are not working.

                                      JonBJ 1 Reply Last reply
                                      0
                                      • R russjohn834

                                        @JonB

                                        This is how I make the connection in Settings.

                                        Settings::Settings(QString patientLabel, QWidget *parent) : QMainWindow(parent)
                                            , ui(new Ui::Settings)
                                        {
                                            ui->setupUi(this);
                                           
                                            connect(&api, &tetra_grip_api::tetraGripEvent,this, &Settings::eventHandler);
                                        }
                                        

                                        Connection is successfull (qDebug()<<connect(....) gives TRUE) also the a QLabel and an LED in the eventHandler slot works perfectly.

                                        In the same way I try to connect in the Patients:

                                        Patients::Patients(QWidget *parent) : QMainWindow(parent)
                                            , ui(new Ui::Patients)
                                        {
                                            ui->setupUi(this);
                                           
                                            connect(&api, &tetra_grip_api::tetraGripEvent,this, &Patients::eventHandlerTwo);
                                        }
                                        

                                        here connection is successfull (qDebug()<<connect(....) gives TRUE) but the a QLabel and an LED in the eventHandlerTwo are not working.

                                        JonBJ Offline
                                        JonBJ Offline
                                        JonB
                                        wrote on last edited by JonB
                                        #19

                                        @russjohn834
                                        How do I know &api refers to the same, global, initialized api instance in both cases?
                                        And I see nothing in code about any QLabel in either case, not mentioned by you before...
                                        You have to supply the necessary/relevant code if you want people to help.
                                        Use a debugger to make sure whether slots are being hit.

                                        1 Reply Last reply
                                        0
                                        • R Offline
                                          R Offline
                                          russjohn834
                                          wrote on last edited by
                                          #20

                                          @JonB

                                          I thought api should be known and accessible to all classes if intialized as global in the main.cpp

                                          #include <QApplication>
                                          
                                          tetra_grip_api api; //-------------> api instance
                                          
                                          int main(int argc, char *argv[])
                                          {
                                              QApplication a(argc, argv);
                                          
                                              api.openSerialPort();
                                              QObject::connect(api.serial, SIGNAL(readyRead()), &api, SLOT(readData()));
                                              QObject::connect(api.serial, SIGNAL(error(QSerialPort::SerialPortError)),&api, SLOT(ErrorHandler(QSerialPort::SerialPortError))); // error handling
                                          
                                          
                                              Settings w(nullptr);
                                              w.show();
                                          
                                              return a.exec();
                                          }
                                          

                                          Correct me if I'm wrong.

                                          JonBJ 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