2010-08-27 9 views
6

In Qt, was ist die eleganteste Art, Daten von einer QDialog-Unterklasse an die Komponente zu übergeben, die den Dialog in den Fällen, in denen Sie etwas komplexerer als einen booleschen oder ganzzahligen Rückgabecode übergeben müssen, übergeben muss?Wie übermittele ich Daten von einem QDialog?

Ich denke, emittieren ein benutzerdefiniertes Signal aus dem accept() Steckplatz, aber gibt es noch etwas anderes?

Antwort

9

QDialog hat seine eigene Nachrichtenschleife und da es Ihre Anwendung Workflow beendet, verwende ich in der Regel nach folgendem Schema:

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

Das ist wahr, wenn der Dialog modal ist ... In meinem Fall war es, aber ich dachte nur, wie würden Sie das in einem nicht-modalen Dialog tun? Ich nehme an, dass das akzeptierte Signal des Dialogs mit einem Steckplatz verbunden wird, wo Sie dieselben Dinge tun wie oben. – teukkam

+0

Es ist also nicht nötig, ein benutzerdefiniertes Signal vom 'accept()' Slot zu senden. Das 'connect'-Signal scheint das richtige zu sein. – tibur

5

Im allgemeinen Fall, wenn die Daten recht einfach ist Ich mag erstellen oder mehr benutzerdefinierte Signale und emittieren diese nach Bedarf. Einfache oder komplexe Daten, ich werde in der Regel Accessoren für die Daten bereitstellen. Im komplexen Fall würde ich dann einen Steckplatz mit dem Signal accepted verbinden und die gewünschten Informationen in diesem Steckplatz abrufen. Der Nachteil besteht darin, dass Sie sich im Allgemeinen darauf verlassen müssen, einen Zeiger auf das Dialogfeld zu speichern oder mithilfe des Hacks sender() herauszufinden, welches Objekt den Slot ausgelöst hat.

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