2012-02-08 18 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

थोड़ा कम गंदा लग सकते हैं अगर आप उन तीन बूलियन्स पैक करने के लिए एक सरल struct बनाया है, और GetOptions से लौटे कि; लेकिन इसके अलावा तकनीक ठीक है। – Mat

उत्तर

4

इस तरह ठीक है, लेकिन आप भी इस तरह के DialogMainWindow पर एक स्लॉट के लिए myDialogFinished(bool, bool, bool) के रूप में एक संकेत फेंकना होने पर दिखाई दे सकता है, के बाद इसे उस तरह से समाप्त हो वापस 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' के 'स्वीकृत' सिग्नल को ओवरराइड कर सकते हैं ?? – scmg

14

मैं आमतौर पर ऐसा करते हैं:

myDialog = new Dialog(); 
if(myDialog->exec()) 
{ 
    bool Opt1, Opt2, Opt3; 
    myDialog->GetOptions(Opt1, Opt2, Opt3); 
    DoSomethingWithThoseBooleans (Opt1, Opt2, Opt3); 
} 
संबंधित मुद्दे