Qt 如何观察插槽?

Qt 如何观察插槽?,qt,signals-slots,Qt,Signals Slots,简短问题:在Qt中是否有任何方法可以钩住或嗅探现有插槽?或者将一个插槽连接到另一个插槽?不改变现有插槽的实现?如果插槽是从系统中的某个地方调用的,则会像观察者一样得到通知 TL;DR 我想重构一个旧的Qt应用程序,它使用一个巨大且有缺陷的单例来托管和管理不同的小部件,并处理它们之间的通信。在第一步中,我不想更改所有托管的小部件,因为它们有很多。我不想更新我的旧singleton的所有安装。所以改变单身对我来说不是一个选择。 让我们在这里引入一点伪代码,首先是单例代码 class UgglyOld

简短问题:在Qt中是否有任何方法可以钩住或嗅探现有插槽?或者将一个插槽连接到另一个插槽?不改变现有插槽的实现?如果插槽是从系统中的某个地方调用的,则会像观察者一样得到通知

TL;DR

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

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上实现oldInteface和启动时寄存器的。通过singleton::instance->sendMessageToTarget(),他们可以向彼此不直接认识的小部件交换信息或命令。很久以前,我认为这是一个很酷的解决方案


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

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


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

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

不是一个选项,因为需要更改原始插槽上的代码,这对我来说不是一个选项。我没有看到任何关于在不更改现有插槽实现的情况下无法更改代码的内容?或者这是不够清楚,还是糟糕的语言?我不是以英语为母语的人:我的意思是这正是属于回购协议的。接受这一解决方案,因为它让我走上了正确的轨道,如何处理这个问题。对其他人来说,我找不到任何简单的方法。如果你找到一个答案,把它贴在这里,我会改变你接受的答案。谢谢你,伙计。为了记录在案,在不改变旧代码的情况下,没有更好的方法了。