2017-06-01 3 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 :: 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

関連する問題