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

ответ

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' ?? – scmg

14

Я обычно делаю это:

myDialog = new Dialog(); 
if(myDialog->exec()) 
{ 
    bool Opt1, Opt2, Opt3; 
    myDialog->GetOptions(Opt1, Opt2, Opt3); 
    DoSomethingWithThoseBooleans (Opt1, Opt2, Opt3); 
} 
Смежные вопросы