4

フォームBによって発行された信号xを処理できるフォームAがあるとします。信号xが発行されたとき、フォームAは何かを実行します。次に、フォームAを閉じ、フォームAを再度開き、シグナルxを待ちます。ただし、信号xを処理するためのスロットは2回呼び出されます。フォームAを閉じて再度開くことを繰り返します。信号xを処理するためのスロットは増加番号と呼ばれます。

受信したのに古い信号が残っているようです。古い信号をクリアする方法はありますか?

少し早いですがお礼を!

4

2 に答える 2

4

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

" Qt::UniqueConnection AutoConnection と同じですが、既存の接続を複製しない場合にのみ接続が確立されます。つまり、同じ信号がオブジェクトの同じペアの同じスロットに既に接続されている場合、接続は失敗します。この接続タイプは Qt 4.6 で導入されました。」

接続呼び出しの最終引数として Qt::UniqueConnection を追加するだけです。

于 2011-07-19T10:03:03.310 に答える
1

フォームAを開いたり、開いたり、閉じたりするコードの部分を投稿する必要があります。

あなたの説明によると、あなたがあなたのフォームを再び開くとき、あなたは実際に新しい(異なるフォームオブジェクト)を作成し、同じ信号を何度も何度も接続しているようです。

作成するform Aのは1回だけ(最初に必要なとき)ですが、プログラムの実行中は引き続き使用してください。それを再び開くときは、実行する必要がありますformA->show()

何かのようなもの

void showFormA() {

    if (myFormA == 0 ) {

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

    myFormA->show();
}

編集:

あなたの質問について、そしてあなたが古い信号を「クリア」できるかどうかについて。http://doc.qt.io/qt-5/qobject.html#disconnectを参照してください

于 2011-07-19T10:51:00.813 に答える