3

クラスのコンストラクターから内部で初期化されたクラスへのQtシグナルスロット接続を作成する必要があるプロジェクトに取り組んでいます。これは、コードがどのように見えるかです。以下の両方の接続を機能させたいのですが、出力が示唆することから、接続#1のみが機能します。私の質問は、接続#2を機能させる方法です!

クラスA

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
4

1 に答える 1

6

コードのシーケンスに従うと、呼び出した時点でそれが明確になるはずです

emit this->demoSignalA();

classB コンストラクターの最初の行では、まだ接続が確立されていません。接続が確立されていない場合、シグナルを送信してもスロットは実行されません。

classB コンストラクターで、接続が確立された後に両方のシグナルを発行する必要があります。

(原則として、コンストラクターが終了するまでシグナルの発行を開始しない方がよいでしょうが、ここでは重要ではありません)

于 2013-10-18T01:14:30.653 に答える