Qt转发信号/插槽连接

KcF*_*nMi 1 c++ qt c++11 qt5 c++14

比方说,SomeClass有成员Object1Object2与之间有一个连接Object1Object2这样的:

connect(Object1, signal1, Object2, slot1)
Run Code Online (Sandbox Code Playgroud)

经过一番重构Object3加入SomeClassObject2被转移到成为其成员Object3,但仍存在之间的连接的需求Object1Object2.

现在Object1和之间的沟通Object2必须经历Object3.这意味着Object3需要修改,添加一对信号/插槽只是为了实现Object1和之间的通信Object2.

这意味着Object3将修改.h和.cpp,添加许多代码行来完成之前在一行中完成的操作.

我懒惰的一面是说这个故事有些奇怪.有没有办法让这种联系更直接?

Rei*_*ica 5

你封装Object2在里面Object3.从图中的点用户Object3,没有什么改变:还是有代码来建立连接只有一行.Object3需要一个额外的插槽,转发到Object2它现在封装的实例.这是一条额外的线.就是这样.

struct Object1 : QObject {
  Q_SIGNAL void signal1();
  Q_OBJECT
};
struct Object2 : QObject {
  Q_SLOT void slot1() {}
  Q_OBJECT
};
class Object3 : QObject {
  Q_OBJECT
  Object2 m_object2;
public:
  // one line to expose object2's slot
  Q_SLOT void slot1() { m_object2.slot1(); }
};

class SomeClass {
  Object1 m_object1;
  Object3 m_object2;
public:
  SomeClass() {
    // still one line
    connect(&m_object1, &Object1::signal1, &m_object3, &Object3::slot1);
  }
};
Run Code Online (Sandbox Code Playgroud)