2017-06-01 91 views
0

簡短的問題: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()它們可以將信息或命令交換到那些不直接相互認識的小部件。很久以前,我認爲這是一個很酷的解決方案。

但是在單例中有太多的小部件會產生很多問題,我不想在這裏討論它。請不要討論或抱怨舊的架構,它不會幫助我!我已經花了數小時的研究來尋找解決方案,希望你們中的某個人能夠幫助我。如果您需要更多信息,請隨時諮詢。

回答

2

你想要什麼GammaRay應用程序,它可以讓你在運行時反思Qt應用程序。無需更改代碼,即可加載Gammaray並啓動應用程序,它將讀取所有QObject,信號和插槽,併爲您提供所需的所有信息(以及更多其他信息)。

+0

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

+0

正是那個回購。 –

+0

接受這個解決方案,因爲它使我在正確的軌道上如何處理問題。對於其他人,我找不到任何簡單的方法。如果你找到了,在這裏發佈,我會改變接受的答案。 – sandkasten

-1

從插槽中您可以嘗試使用QObject :: sender()函數,該函數將返回發送消息的對象。

那然後,您可以訪問來電,來電者類名稱等,所以你可以然後顯示信息,用它來決定做什麼等

+0

不是一種選擇,因爲需要更改原始插槽上的代碼,這對我來說不是一種選擇。 – sandkasten

+0

我沒有看到任何關於無法更改代碼的提示 – lostbard

+1

_無需更改現有SLOT的實施?或者這是不夠清楚還是不好的語言?我不是母語者:/ – sandkasten