2017-02-13 135 views
1

我有QDialog調用Dialog1與兩個按鈕btnDialog2btnDialog3如何啓用QDialog1時QDialog2關閉按鈕

在點擊btnDialog2btnDialog3我有以下代碼運行:

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(); 
} 

正如預期的那樣,如果dialog2dialog3被打開時,各自的按鈕,一個dialog1將被禁用。

我想在各自對話框關閉時重新啓用dialog1上的按鈕。

注:

主對話框有以下兩個私有變量來表示每個對話:

AltDialog *d2, *d3; 

上實現我的目標,任何幫助,將不勝感激!

+0

簡單的解決方案:使用'QDialog :: exec()'而不是'QDialog :: show()'。複雜的解決方案:使用'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.您需要知道finished信號是在用戶或通過調用done(),accept()或reject()設置了對話框的結果代碼時發出的。「 另外它看起來不正確,你正在創建新的AltDialog對象每按一下按鈕。看起來它應該被移動到你的Main Dialog的「初始化」方法以及信號連接。

+0

謝謝!這很好用:) –