2012-02-08 29 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); 
}