【问题标题】:How to observere a SLOT?如何观察一个SLOT?
【发布时间】:2017-06-01 15:00:19
【问题描述】:

小问题:Qt 中是否有任何方法可以挂钩或嗅探现有的 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();
  …
}

它是如何工作的?

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

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

【问题讨论】:

    标签: qt signals-slots


    【解决方案1】:

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

    【讨论】:

    • 意思是这个Githup repo属于KDAB GammaRay
    • 正是那个仓库。
    • 接受这个作为解决方案,因为它让我走上了正确的轨道,如何处理这个问题。对于其他人,我找不到任何简单的方法。如果您找到,请在此处发布,我将更改已接受的答案。
    • 谢谢老兄。而且只是为了记录,不改变旧代码,没有更好的方法。
    【解决方案2】:

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

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

    【讨论】:

    • 不是一个选项,因为需要在原始插槽上更改代码,这对我来说不是一个选项。
    • 我没有看到任何关于无法更改代码的提及
    • 不改变现有SLOT的实现? 还是这不够清楚或语言不好?我不是母语人士:/
    猜你喜欢
    • 1970-01-01
    • 2020-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-14
    相关资源
    最近更新 更多