2017-02-13 5 views
1

私はというDialog1という2つのボタンbtnDialog2btnDialog3を持っています。それぞれのボタンは1 dialog1が無効になり、dialog2またはdialog3が開かれた場合、期待通りにQDialog2が閉じるときにQDialog1のボタンを有効にする方法

void Dialog1::on_btnDialog2_clicked() 
{ 
    ui->btnDialog2->setEnabled(false); 

    d2 = new AltDialog(this); 
    d2->setWindowTitle("Dialog 2"); 
    d2->show(); 
} 

void StockItems::on_btnDialog3_clicked() 
{ 
    ui->btnDialog3->setEnabled(false); 

    d3= new AltDialog(this); 
    d3->setWindowTitle("Dialog 3"); 
    d3->show(); 
} 

btnDialog2btnDialog3をクリックすると

は、私は、次のコードの実行を持っています。

それぞれのダイアログが閉じると、dialog1のボタンを再度有効にします。

注:私の目標を達成する上の任意のヘルプははるかに高く評価されるだろう

AltDialog *d2, *d3; 

メインダイアログには、各ダイアログを表現するには、次の2つのプライベート変数を持っています!

+0

単純な解決策: 'QDialog :: show()'の代わりに 'QDialog :: exec()'を使います。複雑な解決法: 'QDialog :: accepted()'と 'QDialog :: rejected()'シグナルを使います。 –

+1

または 'finished()'または 'done()'です。 @VioletGiraffeは、QDialog :: show()を使わないことを指摘しています。これは、ダイアログが閉じたときにだけトリガーされる前述のすべてのシグナルの放出を止めるからです。非表示は終了と同じではありません。 – rbaleksandar

+0

逆に、イベントループの再入力により擬似同期コードやスタックの廃棄などが発生するため、 'QDialog :: exec()'は使わないでください。 'QDialog :: show()'を使うと、シグナルが適切に出力されます。 –

答えて

1

アプリケーションが終了している場合は、特定のダイアログから通知を受け取る必要があります。

あなたはD2D3ダイアログからの信号を受信するために、あなたのメインダイアログに新しいスロットを作成することができます。たとえば、void QDialog::finished(int result)信号を新たに生成されたスロットによって捕捉されるように接続する。

d2 = new AltDialog(this); 
connect(d2, &QDialog::finished, this, &YourMainDialog::d2Finished); 
d2->setWindowTitle("Dialog 2"); 

... 

void YourMainDialog::d2Finished(int result) 
{ 
    ui->btnDialog2->setEnabled(true); 
} 

P.S.あなたは、ユーザーが、またはdone()、accept()、またはreject()を呼び出して、ダイアログの結果コードが設定されているときに、finishedシグナルが送出されることを認識する必要があります。 また、ボタンを押すたびに新しいのAltDialogオブジェクトが作成されているようには見えません。それはあなたののメインダイアログ "信号の接続"の "初期化"メソッドに移動する必要があるようです。

+0

ありがとう!これはきれいに働いた:) –

関連する問題