如何观察一个 SLOT?

How to observere a SLOT?

简短的问题:Qt 中有什么方法可以钩住或嗅探现有的 SLOT?或者将一个 SLOT 连接到另一个 SLOT?不改变现有 SLOT 的实施?如果从系统中的某处调用插槽,就像观察者一样得到通知。

TL;DR

我想重构一个旧的 Qt 应用程序,它使用一个巨大且有缺陷的单例来托管和管理不同的小部件并处理它们之间的通信。在第一步中,我不想更改所有托管的小部件,因为它们有很多。而且我不想更新我的旧单例的所有安装。所以改变单例对我来说不是一个选择。 让我们在这里引入一点伪代码,首先是单例。

class UgglyOldSingleton
{
private:
  UgglyOldSingleton();
  ~UgglyOldSingleton();
  QList allRegistedWidgets;
public:
  static UgglyOldSingleton *instance();
  void registerMe(oldInterface obj);
public slots:
  void sendMessageToTarget(QString targetName, QString message);
  void action2();
  …
}

它是如何工作的?

每个使用的小部件都是旧接口的实现,并在启动时在单例上注册。通过 singleton::instance->sendMessageToTarget() 他们可以向彼此不直接认识的小部件交换信息或命令。很久以前,我认为这是一个很酷的解决方案。

但是单例上的widget太多会带来很多问题,我不想在这里讨论。请不要讨论或抱怨旧架构,这对我没有帮助!我已经花了几个小时的研究来寻找解决方案,希望你们中的某个人能帮助我。如果您需要任何进一步的信息,请随时询问。

从插槽中,您可以尝试使用 QObject::sender() 函数,该函数将 return 发送消息的对象。

这样您就可以访问来电者、来电者 class 姓名等,这样您就可以显示信息,用它来决定要做什么等。

您想要的是 GammaRay 应用程序,让您在运行时内省 Qt 应用程序。在不更改代码的情况下,加载 Gammaray 并启动应用程序,它将读取所有 QObject、信号和槽,并为您提供所需的所有信息(以及更多信息)。