2011-07-19 13 views
2

私は、フォームBによって放出された信号xを処理できるフォームAを持っていると言う。 信号xが放出されたとき、フォームAは何かを行う。次に、フォームAを閉じ、フォームAを開き、信号xを待ちます。しかし、信号xを処理するためのスロットは2回呼び出される。 フォームAを閉じて再オープンすることを繰り返します。信号xを処理するスロットを増加数といいます。Qt - 古い信号をクリアする

受信しても古い信号がまだ出ているようです。 古い信号を消去する方法はありますか?

ありがとうございます!

+0

あなたのコードのバグのような音ですが、これは起こりません。信号はデフォルトで_同期_であることに注意してください。 – Mat

+0

フォームAをどうやって閉じますか? 'hide()'で? – Exa

+0

close()でフォームAを閉じます – fucai1116

答えて

4

信号/スロット接続は、スロットが信号を受信して​​も消えません。 「一度放出」という概念はありません。したがって、同じ信号/スロットを複数回接続しているようです。フォームAを削除すると、すべての接続が自動的に切断されることに注意してください。だから、接続文の近くにブレークポイントを置き、何が起こっているのかをテストしてください。また、一意の接続を使用することもできます:

"Qt::UniqueConnection AutoConnectionと同じですが、既存の接続を複製しない場合、つまり同じ信号が既に同じスロットに接続されている場合にのみ接続が行われますこの接続タイプはQt 4.6で導入されました。

Qt :: UniqueConnectionを接続の最後の引数として追加するだけです。あなたはあなたがあなたのフォームを再び開いたときに、新しい(異なるフォームオブジェクト)を作成Infactはあるようだあなたの説明によると、あなたが/再び開いたり閉じフォームAを開き、あなたのコードの一部

を投稿する必要があり

+0

私はQt :: UniqueConnectionを使用しようとしましたが、私がデバッグすると、接続はまだ作成されました。フォームAのクローズ時に切断を呼び出すことでこれを解決しました – fucai1116

+0

ダイアログボックスのXボタンをクリックしてフォームAを閉じると、フォームAのデストラクタを認識してフォームAが本当に破棄されないと思います。 。 – fucai1116

+0

X/ok/cancel/etcボタンを押してもダイアログが破壊されることはありません。それが破壊されると、ダイアログが閉じられた後にダイアログからユーザが入力したデータにアクセスすることができなくなります。これは、モーダルダイアログでは非常に問題になる可能性があります。さらに、スタック上にダイアログを作成した場合、どのようにして自身を破壊することができますか? –

1

と同じ信号を何度も繰り返して接続します。

最初に必要なときにform Aを作成する必要がありますが、プログラムの実行中は引き続き使用してください。

あなたの質問について、あなたは「クリア」古い信号をできるかどうか:それを再開するとあなただけのformA->show()

何かEDIT

void showFormA() { 

    if (myFormA == 0) { 

     myFormA = new FormA(this); 
     //connect signals/slots 
     //... 
    } 

    myFormA->show(); 
} 

などを実行する必要があります。 を参照してください http://doc.qt.io/qt-5/qobject.html#disconnect

関連する問題