Qt转发信号/插槽连接

Qt Forwarding signal/slot connections

本文关键字:插槽 连接 发信号 转发 Qt      更新时间:2023-10-16

假设SomeClass有成员Object1Object2,并且Object1Object2之间存在连接,如下所示:

connect(Object1, signal1, Object2, slot1)

经过一些重构后,Object3被添加到SomeClass中,Object2被移至Object3的成员,但仍然存在Object1Object2之间的连接需求。

Object1Object2之间的沟通现在必须经过Object3。这意味着需要修改Object3,添加一对信号/插槽,以实现Object1Object2之间的通信。

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

我懒惰的一面是告诉这个故事中有一些奇怪的东西。有没有办法使这种联系更直接?

您正在将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);
  }
};