2011-11-03 48 views
1

我是Qt开发新手,我们的设计在几个地方使用has-a关系。在某些情况下,容器应该暴露内部物体的信号,然后我现在为每个这样的信号编写了一个专用插槽,在那里我再次发出信号。 Qt中是否有一些快捷方式可以帮助公开容器内部对象的信号?Qt中有关系和信号

回答

5

您不必创建用于重新发送信号的插槽,就可以将信号与另一个信号连接。这样您将避免插槽定义。

所以在你的容器你会是这样的:你必须重新定义你的容器上的信号

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

当然。

欲了解更多详细信息,请检查signal slot documentation

5

documentation

只要你想一个插槽可以连接尽可能多的信号,一个信号可以连接到尽可能多的插槽,你需要。甚至可以将信号直接连接到另一个信号。 (这将立即发出每当第一发射第二信号。)

以下是合法的:

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(); 
} 

其结果是,所述狭槽在这种情况下调用两次。