2013-10-18 3 views
3

Я работаю над проектом, где мне нужно создать соединение с сигнальным слотом Qt от конструктора класса к классу, который он инициализируется внутри. Вот как выглядят коды. Я хочу, чтобы оба упомянутых ниже соединения работали, но из того, что предлагает вывод, работает только соединение №1. Мой вопрос, как сделать соединение # 2 работы!Qt signal-slot confusion

класс А

class classA :public QWidget{ 
    Q_OBJECT 
public: 
    classA(){ 
      emit this->demoSignalA(); 
      } 
signals: 
    void demoSignalA(); 
public slots: 
    void demoSlotA(){qDebug()<<"SIGNAL FROM CLASS B"} 
}; 

Класс B

class classB :public QWidget{ 
    Q_OBJECT 
public: 
    classB(){ 
      classA *a = new classA; 
      connect(this, SIGNAL(demoSignalB()), a, SLOT(demoSlotA())); //WORKS 
      connect(a, SIGNAL(demoSignalA()), this, SLOT(demoSlotB())); //DOESN'T WORK 
      emit this->demoSignalB(); 
      } 
signals: 
    void demoSignalB(); 
public slots: 
    void demoSlotB(){qDebug()<<"SIGNAL FROM CLASS A";} 
}; 

ОСНОВНЫЕ

int main(int argc, char *argv[]){ 
    QApplication a(argc, argv); 
    ... 
    ... 
    classB b;      //INVOCATION INITIATED 

    return a.exec(); 

}

ВЫВОД

SIGNAL FROM CLASS B 

ответ

6

Если следовать последовательности кода, должно быть ясно, что в точке, где вы звоните

emit this->demoSignalA(); 

в первой строке конструктора ClassB, соединение еще не сделано. Если соединение не было выполнено, то после выпускания сигнала порог слота не будет выполнен.

Вы должны испустить оба сигнала после того, как соединения были сделаны, в конструкторе класса B.

(В принципе, вероятно, лучше не начинать излучать сигналы до тех пор, пока вы не закончите конструктор, но это не важно здесь)