假设SomeClass具有成员Object1Object2,并且Object1Object2之间存在联系,例如:

connect(Object1, signal1, Object2, slot1)

Object3中添加了一些重构SomeClass并将Object2移至Object3的成员之后,但仍然需要Object1Object2之间的连接。
Object1Object2之间的通信现在必须通过Object3进行。这意味着Object3需要修改,添加一对信号/插槽,仅用于实现Object1Object2之间的通信。

这意味着Object3的.h和.cpp都将被修改,添加多行代码以完成以前仅用一行完成的操作。

我懒惰的一面说这个故事有些奇怪。有什么办法可以使这种联系更加直接吗?

最佳答案

您正在将Object2封装在Object3中。从Object3用户的 Angular 来看,没有任何变化:建立连接的代码仍然只有一行。 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);
  }
};

关于c++ - Qt转发信号/插槽连接,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38251956/

10-11 00:55