2010-08-27 10 views
6

Dans Qt, quelle est la manière la plus élégante de transmettre des données d'une sous-classe QDialog au composant qui a démarré la boîte de dialogue dans les cas où vous devez transmettre quelque chose de plus complexe qu'un code retour booléen ou entier?Comment transmettre des données à partir d'un QDialog?

Je pense émettre un signal personnalisé de l'emplacement accept() mais y a-t-il autre chose?

Répondre

9

QDialog a sa propre boucle de message et étant donné qu'il arrête votre flux de travail d'application, je l'habitude d'utiliser le schéma suivant:

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

Cela est vrai si la boîte de dialogue est modale ... Dans mon cas c'était le cas, mais je pensais juste comment le feriez-vous dans un dialogue non-modal? Je suppose que connecter le signal accepté de la boîte de dialogue à un emplacement où vous faites la même chose que ci-dessus. – teukkam

+0

Donc, pas besoin d'émettre un signal personnalisé depuis l'emplacement 'accept()'. Le signal 'connect' semble être le bon. – tibur

5

Dans le cas général, si les données sont assez simple, j'aime créer un ou plusieurs signaux personnalisés et émettre ceux-ci si nécessaire. Données simples ou complexes, je fournirai généralement des accesseurs pour les données. Dans le cas complexe, alors, je voudrais connecter un slot au signal accepted, et obtenir les informations souhaitées dans ce slot. L'inconvénient de ceci est que vous devez généralement compter sur le fait de stocker un pointeur sur la boîte de dialogue, ou en utilisant le hack sender() pour déterminer quel objet a déclenché l'emplacement.

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. 
}