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
QtWS25 Last Chance

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
    #3

    You need that Class_B inherited QObject or derived from it, then add macro Q_OBJECT:
    @class Class_B: public QObject
    {
    Q_OBJECT
    private:
    void aMethod();

    signals:
    void trigger_Do_Some(int, int);
    };@
    and in "connect":http://doc.qt.nokia.com/latest/qobject.html#connect use pointers.

    1 Reply Last reply
    0
    • A Offline
      A Offline
      aamer4yu
      wrote on last edited by
      #4

      You need Q_OBJECT declaration in class B.. isnt it ?

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

        Not really, I just added Q_OBJECT, but I have the same error.
        class Class_B : public QThread, public QObject, also the same error.

        Then I added via Singleton:
        @
        const Class_B * pCB = ref2ClassB.GetInstance();
        connect( pCB, SIGNAL(trigger_Do_Some(int, int)), this, SLOT( slot_Do_Some(int, int)) );
        @

        Now I can compile, but therefore LNK2001 and LNK2019 link errors.

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

          Ok, LNK2001 gone, when I removed Q_OBJECT from Class_B. I only let Class_B : public QThread, public QObject

          1 Reply Last reply
          0
          • A Offline
            A Offline
            aamer4yu
            wrote on last edited by
            #7

            Just use
            class Class_B : public QThread

            QThread is already inherited from QObject.
            Does it work ?

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

              QThread inherits from QObject, so class Class_B : public QThread -,public QObject-

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

                Ok, removed.

                @
                const Class_B * pCB = ref2ClassB.GetInstance();
                /// error C2594: 'argument' : ambiguous conversions from 'const Class_B *' to 'const QObject *'
                connect( pCB, SIGNAL(trigger_Do_Some(int, int)), this, SLOT( slot_Do_Some(int, int)) );
                /// error C2664: 'bool QObject::connect(const QObject *,const char *,const QObject *,const char *,Qt::ConnectionType)' : cannot convert parameter 1 from 'Class_B' to 'const QObject *'
                1> No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
                connect( ref2ClassB, SIGNAL(trigger_Do_Some(int, int)), this, SLOT( slot_Do_Some(int, int)) );
                @

                1 Reply Last reply
                0
                • 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