Qt转发信号/插槽连接

时间:2016-07-07 17:41:20

标签: c++ qt c++11 qt5 c++14

我们说SomeClass有成员Object1Object2,并且Object1Object2之间有联系,如:

connect(Object1, signal1, Object2, slot1)

Object3添加了一些重构SomeClass后,Object2被移动为Object3的成员,但仍然需要{{1}之间的连接}和Object1

Object2Object1之间的通信现在必须经过Object2。这意味着需要修改Object3,添加一对信号/广告位,以实现Object3Object1之间的通信。

这意味着Object2' s .h和.cpp都会被修改,添加许多行代码来完成以前只在一行中完成的事情。

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

1 个答案:

答案 0 :(得分: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);
  }
};