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. How to connect two separate classes using signal/slots.
Qt 6.11 is out! See what's new in the release blog

How to connect two separate classes using signal/slots.

Scheduled Pinned Locked Moved Solved General and Desktop
21 Posts 5 Posters 23.2k 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.
  • ? A Former User

    It's a bit strange because really I never ran into that situation. :-/ This might sound stupid, sorry for that, but maybe lean back again and think about it again. Maybe the architecture of your application has some fundamental problem.

    R Offline
    R Offline
    rocklionmba
    wrote on last edited by rocklionmba
    #7

    @Wieland That's a good point. Currently I have it where MainWindow is dealing with the front end, so things like user input and all of that, while Interior_Paint is dealing with the calculations and other stuff,using signals and slots to talk in between each other to pass information. Could there be a problem like this?

    kshegunovK 1 Reply Last reply
    0
    • R rocklionmba

      @Wieland That's a good point. Currently I have it where MainWindow is dealing with the front end, so things like user input and all of that, while Interior_Paint is dealing with the calculations and other stuff,using signals and slots to talk in between each other to pass information. Could there be a problem like this?

      kshegunovK Offline
      kshegunovK Offline
      kshegunov
      Moderators
      wrote on last edited by kshegunov
      #8

      If Interior_Paint has a private member, then it is private. That's the purpose - not to expose something that's not part of the interface. So your question boils down to: "how can I gut my class and expose its internals", well you can do it, but you really shouldn't. Instead you should expose a method of your Interior_Paint class that does what you want and only through Interior_Paint's interface you'd modify/access it's internal private member object.

      Read and abide by the Qt Code of Conduct

      R 1 Reply Last reply
      0
      • kshegunovK kshegunov

        If Interior_Paint has a private member, then it is private. That's the purpose - not to expose something that's not part of the interface. So your question boils down to: "how can I gut my class and expose its internals", well you can do it, but you really shouldn't. Instead you should expose a method of your Interior_Paint class that does what you want and only through Interior_Paint's interface you'd modify/access it's internal private member object.

        R Offline
        R Offline
        rocklionmba
        wrote on last edited by rocklionmba
        #9

        @kshegunov could you maybe show an example of what you mean? I get the gist of what your saying, but I wouldn't know how exactly I would implement it.

        kshegunovK 1 Reply Last reply
        0
        • R rocklionmba

          @kshegunov could you maybe show an example of what you mean? I get the gist of what your saying, but I wouldn't know how exactly I would implement it.

          kshegunovK Offline
          kshegunovK Offline
          kshegunov
          Moderators
          wrote on last edited by kshegunov
          #10
          class A : public QObject
          {
              Q_OBJECT
              // ...
          signals:
               void signalFromAtoC();
          };
          
          class C
          {
          public:
              void methodToBeCalledFromA();
          };
          
          class B : public QObject
          {
              Q_OBJECT
              // ...
          public slots:
               void delegateToCSlot()
               {
                   privateMember.methodToBeCalledFromA(); //< Delegate the call
               }
          
          private:
               C privateMember;
          }
          

          then you use as before:

          A a;
          B b;
          
          QObject::connect(&a, &A::signalFromAtoC, &b, &B::delegateToCSlot);
          

          If all classes are QObjects then you can also directly forward the signal to another signal in B, which you can connect to a slot in C.

          Read and abide by the Qt Code of Conduct

          R 1 Reply Last reply
          4
          • kshegunovK kshegunov
            class A : public QObject
            {
                Q_OBJECT
                // ...
            signals:
                 void signalFromAtoC();
            };
            
            class C
            {
            public:
                void methodToBeCalledFromA();
            };
            
            class B : public QObject
            {
                Q_OBJECT
                // ...
            public slots:
                 void delegateToCSlot()
                 {
                     privateMember.methodToBeCalledFromA(); //< Delegate the call
                 }
            
            private:
                 C privateMember;
            }
            

            then you use as before:

            A a;
            B b;
            
            QObject::connect(&a, &A::signalFromAtoC, &b, &B::delegateToCSlot);
            

            If all classes are QObjects then you can also directly forward the signal to another signal in B, which you can connect to a slot in C.

            R Offline
            R Offline
            rocklionmba
            wrote on last edited by
            #11

            @kshegunov What exactly does

            privateMember.methodToBeCalledFromA(); 
            

            do? I haven't seen anything like it before.

            kshegunovK 1 Reply Last reply
            0
            • R rocklionmba

              @kshegunov What exactly does

              privateMember.methodToBeCalledFromA(); 
              

              do? I haven't seen anything like it before.

              kshegunovK Offline
              kshegunovK Offline
              kshegunov
              Moderators
              wrote on last edited by
              #12

              It's a method call, you should've seen it while learning C++.

              Read and abide by the Qt Code of Conduct

              R 1 Reply Last reply
              2
              • kshegunovK kshegunov

                It's a method call, you should've seen it while learning C++.

                R Offline
                R Offline
                rocklionmba
                wrote on last edited by
                #13

                @kshegunov I still am. I'm a second year CS/CE student.

                mrjjM 1 Reply Last reply
                0
                • R rocklionmba

                  @kshegunov I still am. I'm a second year CS/CE student.

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

                  @rocklionmba
                  Hi
                  Its just non pointer syntax for calling a method/access member.

                  C privateMemberVAR;
                  privateMemberVAR.methodToBeCalledFromA();

                  in contrast to
                  C *privateMemberVAR = new C;
                  privateMemberVAR->methodToBeCalledFromA();

                  R 1 Reply Last reply
                  0
                  • mrjjM mrjj

                    @rocklionmba
                    Hi
                    Its just non pointer syntax for calling a method/access member.

                    C privateMemberVAR;
                    privateMemberVAR.methodToBeCalledFromA();

                    in contrast to
                    C *privateMemberVAR = new C;
                    privateMemberVAR->methodToBeCalledFromA();

                    R Offline
                    R Offline
                    rocklionmba
                    wrote on last edited by rocklionmba
                    #15

                    @mrjj so it would be """ interior_paint:: privatememberVAR.somefunction(){ //code here }""" ?

                    mrjjM 1 Reply Last reply
                    0
                    • R rocklionmba

                      @mrjj so it would be """ interior_paint:: privatememberVAR.somefunction(){ //code here }""" ?

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

                      @rocklionmba

                      Hi
                      Where ?
                      In the slot ?

                      The main trick here is that, the slot calls the private member. Not directly from outside.
                      Its triggered via the signal.

                      Maybe show how interior_paint looks like.

                      and it will end up in something like
                      void interior_paint::TheNewSlot() {
                      privatememberVAR.somefunction();
                      }

                      R 1 Reply Last reply
                      0
                      • mrjjM mrjj

                        @rocklionmba

                        Hi
                        Where ?
                        In the slot ?

                        The main trick here is that, the slot calls the private member. Not directly from outside.
                        Its triggered via the signal.

                        Maybe show how interior_paint looks like.

                        and it will end up in something like
                        void interior_paint::TheNewSlot() {
                        privatememberVAR.somefunction();
                        }

                        R Offline
                        R Offline
                        rocklionmba
                        wrote on last edited by
                        #17

                        @mrjj so in terms that I'm using, class A would be MainWindow, B is the extra class to handle info, and C is interior_paint?

                        mrjjM 1 Reply Last reply
                        0
                        • R rocklionmba

                          @mrjj so in terms that I'm using, class A would be MainWindow, B is the extra class to handle info, and C is interior_paint?

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

                          @rocklionmba
                          Well B is the interior_paint that has the private member you want to call a method on
                          and A is mainwin.
                          C is the private member class (inside interior_paint )

                          The mainwindow will fire its new signal signalFromAtoC and that will call
                          delegateToCSlot that call its private class and its function.

                          R 1 Reply Last reply
                          2
                          • AmoghA Offline
                            AmoghA Offline
                            Amogh
                            wrote on last edited by
                            #19

                            you can do it by sending signals from both the classes and catch in a slot

                            1 Reply Last reply
                            0
                            • mrjjM mrjj

                              @rocklionmba
                              Well B is the interior_paint that has the private member you want to call a method on
                              and A is mainwin.
                              C is the private member class (inside interior_paint )

                              The mainwindow will fire its new signal signalFromAtoC and that will call
                              delegateToCSlot that call its private class and its function.

                              R Offline
                              R Offline
                              rocklionmba
                              wrote on last edited by
                              #20

                              @mrjj Hey, so I finally had the chance to try it out today and I noticed a problem with it. I'm using a dynamic array, so it naturally has to be a pointer for it to work. Also, a and b in the example are together, while in the actual code both are made in their constructors. Would the pointer make a problem? and would I have to move the location of where the variables are made for it to work?

                              mrjjM 1 Reply Last reply
                              0
                              • R rocklionmba

                                @mrjj Hey, so I finally had the chance to try it out today and I noticed a problem with it. I'm using a dynamic array, so it naturally has to be a pointer for it to work. Also, a and b in the example are together, while in the actual code both are made in their constructors. Would the pointer make a problem? and would I have to move the location of where the variables are made for it to work?

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

                                @rocklionmba said in How to connect two separate classes using signal/slots.:

                                Would the pointer make a problem?

                                Not at all. Just make sure they are initialized before any of the slots can be triggered.

                                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