如何观察SLOT?

如何观察SLOT?

问题描述:

简短的问题:Qt中是否有任何方法来钩住或嗅探现有的SLOT?或者也许连接一个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(); 
    … 
} 

它是如何工作的?

每个使用的窗口小部件都实现了oldInteface和singleton上的启动寄存器。通过singleton :: instance-> sendMessageToTarget()它们可以将信息或命令交换到那些不直接相互认识的小部件。很久以前,我认为这是一个很酷的解决方案。

但是在单例中有太多的小部件会产生很多问题,我不想在这里讨论它。请不要讨论或抱怨旧的架构,它不会帮助我!我已经花了数小时的研究来寻找解决方案,希望你们中的某个人能够帮助我。如果您需要更多信息,请随时咨询。

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

+0

意指属于[KDAB GammaRay](https://www.kdab.com/)的[Githup repo](https://github.com/KDAB/GammaRay)? – sandkasten

+0

正是那个回购。 –

+0

接受这个解决方案,因为它使我在正确的轨道上如何处理问题。对于其他人,我找不到任何简单的方法。如果你找到了,在这里发布,我会改变接受的答案。 – sandkasten

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

那然后,您可以访问来电,来电者类名称等,所以你可以然后显示信息,用它来决定做什么等

+0

不是一种选择,因为需要更改原始插槽上的代码,这对我来说不是一种选择。 – sandkasten

+0

我没有看到任何关于无法更改代码的提示 – lostbard

+1

_无需更改现有SLOT的实施?或者这是不够清楚还是不好的语言?我不是母语者:/ – sandkasten