2011-11-03 2 views
1

私はQtで開発するのが初めてで、私たちのデザインはいくつかの場所でhas-a関係を使用しています。これらのケースの中には、コンテナが内部オブジェクトの信号を公開する必要があります。そして、私は現在、このような信号ごとにプライベートスロットを作成しています。実際には、再度信号を再発光します。 Qtには、内部オブジェクトの信号をコンテナに公開するのに役立つショートカットがありますか?Qtでの関係とシグナル

答えて

5

信号を再発信するためのスロットを作成する必要はなく、別の信号と信号を接続することもできます。こうすることで、スロット定義を回避できます。もちろん

connect(object, SIGNAL(signal1()), this, SIGNAL(signal1())); 

あなたは、コンテナ上の信号を再定義する必要があります。

は、だからあなたの容器の中に、あなたはこのようなものを持っているでしょう。詳細については

documentationからsignal slot documentation

5

を確認してください。

あなたは、単一のスロットに必要な数の信号を接続することができ、かつ信号があなたのように多くのスロットに接続することができます必要。信号を別の信号に直接接続することも可能です。 (これは、最初は放出され、すぐにいつでも第2の信号を発します。)

次は合法です:

connect(sender, SIGNAL(originalSignal()), SIGNAL(newSignal())); 
-1

それはあなたのクラスの内部構造である場合は、なぜあなたはそれの友人ことはありませんクラス。その後、内部構造体の内部で直接呼び出すことができますemit parentObj->signal()

+0

あなたはあなたのdownvoteについて説明しますか? –

0

信号の再発光により、複数の信号を再放射することもできます。

testclass.h:

#include <QObject> 
#include <QDebug> 

class TestClass : public QObject 
{ 
Q_OBJECT 
public: 
    explicit TestClass(QObject *parent = 0) 
    { 
     connect(this, SIGNAL(signal1()), this, SIGNAL(signal2())); 
     connect(this, SIGNAL(signal1()), this, SIGNAL(signal2())); 
     connect(this, SIGNAL(signal2()), this, SLOT(slot())); 
    } 
    void emitSignal1() 
    { 
     emit signal1(); 
    } 

signals: 
    void signal1(); 
    void signal2(); 

public slots: 
    void slot() 
    { 
     qDebug() << "SLOT HAS BEEN CALLED"; 
    } 
}; 

main.cppに:

#include <QCoreApplication> 
#include "testclass.h" 

int main(int argc, char *argv[]) 
{ 
    QCoreApplication a(argc, argv); 

    TestClass instance; 

    instance.emitSignal1(); 

    return a.exec(); 
} 

結果、スロットが、この場合には2回呼び出されていることです。

関連する問題