2012-02-08 104 views
6

我想設計一個主窗口和一個QDialog,並找到從QDialog返回數據的最佳方法。如何從QDialog中返回數據?

現在我正在捕獲對話框中的accepted()信號,之後我調用返回數據的對話框函數。有沒有更好的方法?

這裏是工作的代碼,我現在有:

class MainWindow : public QMainWindow 
{ 
// ... 

public slots: 
    void showDialog() 
    { 
     if (!myDialog) 
     { 
      myDialog = new Dialog(); 
      connect(myDialog, SIGNAL(accepted()), this, SLOT(GetDialogOutput())); 
     } 
     myDialog->show(); 
    } 
    void GetDialogOutput() 
    { 
     bool Opt1, Opt2, Opt3; 
     myDialog->GetOptions(Opt1, Opt2, Opt3); 
     DoSomethingWithThoseBooleans (Opt1, Opt2, Opt3); 
    } 

private: 
    void DoSomethingWithThoseBooleans (bool Opt1, bool Opt2, bool Opt3); 
    Dialog * myDialog; 

}; 

,並在對話框:

class Dialog : public QDialog 
{ 
// ... 

public: 
    void GetOptions (bool & Opt1, bool & Opt2, bool & Opt3) 
    { 
     Opt1 = ui->checkBox->isChecked(); 
     Opt2 = ui->checkBox_2->isChecked(); 
     Opt3 = ui->checkBox_3->isChecked(); 
    } 
}; 

這看起來凌亂。有更好的設計嗎?我錯過了什麼嗎?

+4

看起來少了幾分凌亂,如果你創建了一個簡單的結構收拾這三個布爾值,並返回從GetOptions;但除此之外,這項技術很好。 – Mat 2012-02-08 14:05:56

回答

4

這樣是好的,但你也可以看看有Dialog發出信號,如myDialogFinished(bool, bool, bool)到插槽MainWindow,省去了它的完成這種方式後回Dialog調用。

3

另一種選擇是在對話框中傳遞一個地方以存儲完成後的數據。通常,我會在對話框的實例化過程中執行此操作。

class Dialog : public QDialog 
{ 
public: 
    Dialog(DialogResult* a_oResult) : m_oResult(a_oResult) {} 

signals: 
    void accepted() 
    { 
     DialogResult result; 
     // get results into 'result' 
     *m_oResult = result; 
    } 
private: 
    DialogResult *m_oResult; 
} 
+0

我不確定你是否可以重寫'QDialog'的'accepted'信號? – scmg 2016-06-30 21:28:08

14

我經常這樣做:

myDialog = new Dialog(); 
if(myDialog->exec()) 
{ 
    bool Opt1, Opt2, Opt3; 
    myDialog->GetOptions(Opt1, Opt2, Opt3); 
    DoSomethingWithThoseBooleans (Opt1, Opt2, Opt3); 
}