2012-02-08 13 views
6

Próbuję zaprojektować główne okno i QDialog oraz znaleźć najlepszy sposób zwrócenia danych z QDialog.Jak zwrócić dane z QDialog?

Teraz przechwytuję sygnał accepted() z okna dialogowego, po czym wywołuję funkcję okna dialogowego, która zwraca dane. Czy istnieje lepszy sposób?

Oto kod roboczych, które mam teraz:

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; 

}; 

i Dialog:

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

To wygląda niechlujnie. Czy jest lepszy projekt? Czy czegoś brakuje?

+4

wyglądałby nieco mniej brudny jeśli stworzyliśmy prosty struct pakować te trzy wartości logicznych i wrócił że od getOptions; ale poza tym technika jest w porządku. – Mat

Odpowiedz

4

ten sposób jest w porządku, ale można też spojrzeć na konieczności Dialog emitowania sygnału, takich jak myDialogFinished(bool, bool, bool) do gniazda MainWindow, oszczędza konieczności oddzwonić do Dialog po jego zakończeniu w ten sposób.

3

Kolejną opcją jest przekazanie okna dialogowego do miejsca przechowywania danych po zakończeniu. Zazwyczaj robiłbym to podczas tworzenia okna dialogowego.

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

Nie jestem pewien, czy można przesłonić 'akceptowany' sygnał' QDialog' ?? – scmg

14

I zazwyczaj to zrobić:

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