2010-08-27 28 views
6

En Qt, ¿cuál es la forma más elegante de pasar datos de una subclase QDialog al componente que inició el diálogo en los casos en que necesita transmitir algo más complejo que un código de retorno booleano o entero?Cómo pasar datos de un QDialog?

Estoy pensando en emitir una señal personalizada desde la ranura accept(), pero ¿hay algo más?

Respuesta

9

QDialog tiene su propio bucle de mensajes y desde que se detenga el flujo de trabajo de aplicación, por lo general utiliza el siguiente esquema:

MyQDialog dialog(this); 
dialog.setFoo("blah blah blah"); 
if(dialog.exec() == QDialog::Accepted){ 
    // You can access everything you need in dialog object 
    QString bar = dialog.getFoo(); 
} 
+0

Esto es cierto si el diálogo es modal ... En mi caso, sí, pero yo estaba pensando ¿cómo harías esto en un diálogo no modal? Supongo que conecta la señal aceptada del diálogo a una ranura donde haces lo mismo que arriba. – teukkam

+0

Por lo tanto, no es necesario emitir una señal personalizada desde la ranura 'accept()'. La señal 'connect' parece ser la apropiada. – tibur

5

En el caso general, si los datos son bastante simples me gusta crear uno o más señales personalizadas y emitirlas según sea necesario. Datos simples o complejos, generalmente proporcionaré descriptores de acceso para los datos. En el caso complejo, entonces, conectaría una ranura a la señal accepted y obtendría la información deseada en esa ranura. La desventaja de esto es que generalmente necesita confiar en el almacenamiento de un puntero al diálogo, o usar el truco sender() para descubrir qué objeto activó el espacio.

void Foo::showDialog() 
{ 
    if (!m_dlg) 
    { 
     m_dlg = new Dialog(this); 
     connect(m_dlg, SIGNAL(accepted()), SLOT(onDialogAccepted())); 
    } 
    m_dlg->Setup(m_bar, m_bat, m_baz); 
    m_dlg->show(); 
} 

void Foo::onDialogAccepted() 
{ 
    m_bar = m_dlg->bar(); 
    m_bat = m_dlg->bat(); 
    m_baz = m_dlg->baz(); 
    // optionally destroy m_dlg here. 
} 
Cuestiones relacionadas