有一个函数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
- (实际上,C1
,C2
,C3
) - 需要对数据执行的工作(使用常见状态,如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); }