• 2379阅读
  • 10回复

[提问]QT有没有类似安卓EventBus的功能 [复制链接]

上一主题 下一主题
离线qq2632671
 

只看楼主 倒序阅读 楼主  发表于: 2020-08-24
在Qt中使用信号于槽,但这里有个问题,当我的工程比较复杂时,比如

D是C的类成员,C是B的类成员,B是A的类成员;
T4是T3的类成员,T3是T2的类成员,T2是T1的类成员;

然后D有个QString需要传递给T4,那我不得不进行一大串的信号与曹的连接,即D->C->B->A->T1->Y2->T3->T4;

而实际情况因为工程比较大,信号于槽的连接比这个还要复杂,我想问下有没有类似安卓EventBus的这种机制,不需要显示的连接
离线jack_zhang

只看该作者 1楼 发表于: 2020-08-24
是不是可以不用信号槽的方式?
创建一个socket类,用来两个类的交互?
离线gnibuoz

只看该作者 2楼 发表于: 2020-08-24
没有现成的,但是这个自己造一个也很简单啊,可以创建一个如下的专门用来处理复杂信号槽的单例类,然后在有该种需求的时候,只需要引入这个头文件,然后用这个单例类里边的信号来通信就可以了,触发的时候直接Observer::instance()->somethingChanged("我是参数");然后在接收方直接connenct这个单例的信号就好了
  1. /// Observer.h
  2. /**
  3.    观察者单例类
  4. **/
  5. struct Observer : QObject{
  6.     Q_OBJECT
  7. public:
  8.     static Observer* instance()
  9.     {
  10.     static Observer _;
  11.     return &_;
  12.     }
  13. signals:
  14. void somethingChanged(const QString& content);
  15. private:
  16.     Observer(){}
  17. }

我就是我,颜色不一样的烟火...
离线青空飞羽

只看该作者 3楼 发表于: 2020-08-24
直接将D和T4进行信号槽连接呢,为啥要中转那么多次呢
离线cj123sn

只看该作者 4楼 发表于: 2020-08-25
globalSignal 单例
离线九重水

只看该作者 5楼 发表于: 2020-08-25
3楼正解!直接对接D和T4,中间的雨女无瓜。
connect(A->B->C->D, SIGNAL(...), T1->T2->T3->T4, SLOT(....))

离线qq2632671

只看该作者 6楼 发表于: 2020-08-25
回 九重水 的帖子
九重水:3楼正解!直接对接D和T4,中间的雨女无瓜。[表情]
connect(A->B->C->D, SIGNAL(...), T1->T2->T3->T4, SLOT(....))
 (2020-08-25 14:31) 

你们的类成员都是公有的嘛。。。。。。

一个类包有两个类成员A和T1,那A的类成员B,你怎么写?
离线qq2632671

只看该作者 7楼 发表于: 2020-08-25
回 青空飞羽 的帖子
青空飞羽:直接将D和T4进行信号槽连接呢,为啥要中转那么多次呢 (2020-08-24 14:09) 

假设一个类,类成员有A和T1,那要想链接D和T4,该怎么写?

像5楼说的那样connect(A->B->C->D,signals,T1->T2->T3->T4,slots);?

你们的类成员都是公有的嘛?

离线青空飞羽

只看该作者 8楼 发表于: 2020-08-25
回 qq2632671 的帖子
qq2632671:假设一个类,类成员有A和T1,那要想链接D和T4,该怎么写?
像5楼说的那样connect(A->B->C->D,signals,T1->T2->T3->T4,slots);?
....... (2020-08-25 15:54)

如果类成员是公有的就可以直接访问,如果不是,可以封装一个公有方法返回类成员的引用或指针
离线九重水

只看该作者 9楼 发表于: 2020-08-26
8楼正解。
另外友元好像也可以,我忘了C++友元的用法。最近在写C
离线luansxx

只看该作者 10楼 发表于: 2021-09-26
我自己实现了一个,有需要的试试看,好用的话,别忘了给个 star

https://github.com/cmguo/QtEventBus

快速回复
限100 字节
 
上一个 下一个