2012-02-08 31 views
6

Estoy tratando de diseñar una ventana principal y un QDialog, y para encontrar la mejor manera de devolver los datos desde un QDialog.¿Cómo devolver datos de QDialog?

En este momento estoy capturando la señal accepted() del cuadro de diálogo, después de lo cual llamo a la función de diálogo que devuelve los datos. ¿Hay alguna forma mejor?

Aquí está el código de trabajo que ahora tengo:

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; 

}; 

Y el diálogo:

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

Eso se ve desordenado. ¿Hay un mejor diseño? ¿Me estoy perdiendo de algo?

+4

Se vería un poco menos complicado si ha creado una estructura sencilla para empacar esos tres valores booleanos, y que a partir de getOptions volverá; pero aparte de eso, la técnica está bien. – Mat

Respuesta

4

De esa manera está muy bien, pero también se podría mirar a tener Dialog emiten una señal como myDialogFinished(bool, bool, bool) a una ranura en MainWindow, ahorra tener que llamar de nuevo a Dialog después de que haya terminado de esa manera.

3

Otra opción más es pasar un cuadro de diálogo para almacenar los datos cuando se hace. Normalmente, lo haría durante la creación de instancias del diálogo.

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

no estoy seguro de si puede anular la señal de 'aceptado' de 'QDialog' ?? – scmg

14

que suelo hacer esto:

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