发送器处于信号到信号连接

时间:2014-09-07 19:08:26

标签: qt signals-slots qobject

有一个函数QObject::sender(),当在一个槽中调用时,它会向发送对象提供QObject*指针。

如果您具有以下结构,那么它的行为就没那么有用了。

class A : public QObject { Q_OBJECT 
    ...
    signals: 
        void foo(); 
};

class B : public QObject { Q_OBJECT 
    ...
    signals: 
        void foo(); 
};

class C : public QObject { Q_OBJECT
    ... 
    public slots: 
        void bar() { qDebug() << sender(); }  
};

A a; 
B b;
C c;


connect(&A, SIGNAL(foo()), &B, SIGNAL(foo()));
connect(&B, SIGNAL(foo()), &C, SLOT(bar()));

A::whatever() { emit foo(); } 

C::bar()表示B为发射器。如何在不处理所有继电器的情况下获得原始发射物体?

不幸的是QObject::sender()protected所以C::bar()中的这种天真的方法无法编译(不确定它是否可行,但这是我唯一的想法向后遍历sender()

QObject *ptr = this;
while ((ptr = ptr->sender()) != NULL)
    qDebug() << ptr->objectName();

回答评论中提出的一些问题:

  • A - 自定义小部件(大量动态创建的小部件)(保存一些数据,指针等等)
  • B - 自定义顶级UI元素(QStackedWidget的成员,处理一些UI职责)
  • C - (实际上,C1C2C3) - 需要对数据执行的工作(使用常见状态,如DSP队列)存储在As。

最终,A需要了解C(或者即使有任何关心它的信号)。 B是发生UI聚合的地方(也是顶级UI调用C来设置DSP参数等)。 C需要知道sender() qobject_cast是否能够IA接口。

可以对以下内容进行修改:

class A : public QObject { Q_OBJECT 
    ...
    signals: 
        void foo(QObject*); 
};

class B : public QObject { Q_OBJECT 
    ...
    signals: 
        void foo(QObject*); 
};

class C : public QObject { Q_OBJECT
    ... 
    public slots: 
        void bar(QObject* mySender) { qDebug() << mySender; }  
};

A a; 
B b;
C c;


connect(&A, SIGNAL(foo(QObject*)), &B, SIGNAL(foo(QObject*)));
connect(&B, SIGNAL(foo(QObject*)), &C, SLOT(bar(QObject*)));

A::whatever() { emit foo(this); } 

0 个答案:

没有答案