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 Slot connection from different classes

Signal Slot connection from different classes

Scheduled Pinned Locked Moved General and Desktop
20 Posts 8 Posters 22.2k Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • R Offline
    R Offline
    rokemoon
    wrote on last edited by
    #10

    [quote]
    All classes that contain signals or slots must mention Q_OBJECT at the top of their declaration. They must also derive (directly or indirectly) from QObject.
    [/quote] from "here":http://doc.qt.nokia.com/4.7/signalsandslots.html

    const Class_B * pCB = ref2ClassB.GetInstance();
    // here the Class_B must inherit from QOBject
    connect( pCB, SIGNAL(trigger_Do_Some(int, int)), this, SLOT( slot_Do_Some(int, int)) );

    // here you need the pointer
    connect( &ref2ClassB, SIGNAL(trigger_Do_Some(int, int)), this, SLOT( slot_Do_Some(int, int)) );

    1 Reply Last reply
    0
    • H Offline
      H Offline
      huckfinn
      wrote on last edited by
      #11

      [quote author="rokemoon" date="1313050079"]
      // here you need the pointer
      connect( &ref2ClassB, SIGNAL(trigger_Do_Some(int, int)), this, SLOT( slot_Do_Some(int, int)) );
      [/quote]

      This way I get an error C2594: 'argument' : ambiguous conversions from 'Class_B *' to 'const QObject *'

      1 Reply Last reply
      0
      • R Offline
        R Offline
        rokemoon
        wrote on last edited by
        #12

        Class_B must inherite QObject (directly or indirectly), can you give us latest code of your Class_B?

        1 Reply Last reply
        0
        • H Offline
          H Offline
          huckfinn
          wrote on last edited by
          #13

          Latest Class_B:
          @
          #include <QtCore/QThread>

          template class SWITCHEXPORT QMap< int, QString >;

          class Class_A;
          class QModelIndex;

          class SWITCHEXPORT Class_B : public QThread {
          Q_OBJECT

          public:
          /// @brief Constructor
          Class_B( void );

          void aMethod();

          signal:
          void trigger_Do_Some(int, int);

          private:
          QMap< int, QString > categoryNameByID;
          }
          @

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

            Can you tell us why you use QThread? Can you try inherite from QObject and tell us about result?

            1 Reply Last reply
            0
            • H Offline
              H Offline
              huckfinn
              wrote on last edited by
              #15

              There is a @QThread::start();@ in the source .cpp .

              So when I inherit from both @clas.s Class_B : public QThread, public QObject@ and I am able to compile it.

              But now I have linking errors:
              @
              3>Linking...
              3> Creating library C:\MyProject\Debug\MyProject.lib and object C:\MyProject\Debug\MyProject.exp
              3>Class_B.obj : error LNK2001: unresolved external symbol "public: static struct QMetaObject const Class_B::staticMetaObject" (?staticMetaObject@Class_B@@2UQMetaObject@@B)
              3>Class_A.obj : error LNK2001: unresolved external symbol "public: static struct QMetaObject const Class_B::staticMetaObject" (?staticMetaObject@Class_B@@2UQMetaObject@@B)
              3>Class_3.obj : error LNK2001: unresolved external symbol "public: static struct QMetaObject const Class_B::staticMetaObject" (?staticMetaObject@Class_B@@2UQMetaObject@@B)
              3>Class_B.obj : error LNK2001: unresolved external symbol "public: virtual struct QMetaObject const * __thiscall Class_B::metaObject(void)const " (?metaObject@Class_B@@UBEPBUQMetaObject@@XZ)
              3>Class_B.obj : error LNK2001: unresolved external symbol "public: virtual void * __thiscall Class_B::qt_metacast(char const *)" (?qt_metacast@Class_B@@UAEPAXPBD@Z)
              3>Class_B.obj : error LNK2001: unresolved external symbol "public: virtual int __thiscall Class_B::qt_metacall(enum QMetaObject::Call,int,void * *)" (?qt_metacall@Class_B@@UAEHW4Call@QMetaObject@@HPAPAX@Z)
              3>Class_B.obj : error LNK2019: unresolved external symbol "protected: void __thiscall Class_B::trigger_Do_Some(long,long)" (?trigger_Do_Some@Class_B@@IAEXJJ@Z) referenced in function "public: virtual void __thiscall Class_B::HandleMessage(void * const)" (?HandleMessage@Class_B@@UAEXQAX@Z)
              3>C:\MyProject\Debug\MyProject.dll : fatal error LNK1120: 5 unresolved externals
              @

              1 Reply Last reply
              0
              • M Offline
                M Offline
                mrtc3
                wrote on last edited by
                #16

                When you have added Q_OBJECT to Class_B.h recently, then assure yourself that moc_ClassB.cxx has been generated as well.
                If that is the case, this moc-file should be listed in the .pro or .vcpro file as Source
                e.g.:
                @
                <Files>
                <Filter Name="Source Files">
                <File RelativePath="C:\path\moc_Class_B.cxx">
                </File>
                <!-- ....etc...-->
                @

                There are 10 types. Those who understand binary and those who don't .)

                1 Reply Last reply
                0
                • H Offline
                  H Offline
                  huckfinn
                  wrote on last edited by
                  #17

                  I added these tags to the vcpro file, now I can compile and run my application.

                  However, now I have a
                  @
                  warning C4584: 'Class_B' : base-class 'QObject' is already a base-class of 'OtherClass'
                  @

                  I dont like warnings :(

                  1 Reply Last reply
                  0
                  • L Offline
                    L Offline
                    loladiro
                    wrote on last edited by
                    #18

                    Multiple inheritance is NOT supported for QObject based classes. Can you change your code?

                    1 Reply Last reply
                    0
                    • R Offline
                      R Offline
                      Ramin7000
                      wrote on last edited by
                      #19

                      main.cpp :
                      @
                      #include <QtGui>
                      #include <converter.h>

                      int main(int argc,char *argv[])
                      {
                      QApplication app(argc,argv);

                      QGraphicsScene scene(0,0,500,300);
                      QGraphicsView view(&scene);
                      
                      QLabel *l = new QLabel();
                      QSlider *s = new QSlider();
                      
                      l->setText("Move the slider handle");
                      s->setOrientation(Qt::Horizontal);
                      
                      l->setGeometry(100,100,150,50);
                      s->setGeometry(100,200,150,50);
                      
                      Converter *ms = new Converter(s,l);
                      
                      
                      scene.addWidget(l);
                      scene.addWidget(s);
                      
                      view.show();
                      return app.exec&#40;&#41;;
                      

                      }@

                      converter.cpp :
                      @
                      #include "converter.h"

                      Converter::Converter(QSlider *s, QLabel *l)
                      {
                      connect(s,SIGNAL(valueChanged(int)),this,SLOT(Changer(int)));
                      connect(this,SIGNAL(Changer(QString)),l,SLOT(setText(QString)));
                      }

                      void Converter::Changer(int x)
                      {
                      Changer(QString::number(x));
                      }
                      @

                      converter.h :
                      @
                      #ifndef CONVERTER_H
                      #define CONVERTER_H

                      #include <QtGui>

                      class Converter : public QObject
                      {
                      Q_OBJECT

                      public:
                      Converter(QSlider*,QLabel*);

                      protected slots:
                      void Changer(int);

                      signals:
                      void Changer(QString);

                      };

                      #endif // CONVERTER_H
                      @

                      [Edit: Please use @ tags around code. I have added them here. -- mlong]

                      Ramin Lohrasbi

                      1 Reply Last reply
                      0
                      • V Offline
                        V Offline
                        vittalonline
                        wrote on last edited by
                        #20

                        Use Q_PROPERTY for passing arguments in Class-B

                        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