Как передать данные из QDialog? - PullRequest
7 голосов
/ 27 августа 2010

В Qt, каков самый элегантный способ передачи данных из подкласса QDialog в компонент, запустивший диалог, в случаях, когда вам нужно передать что-то более сложное, чем логический или целочисленный код возврата?

Я думаю, издает нестандартный сигнал из слота accept(), но есть ли что-то еще?

Ответы [ 2 ]

11 голосов
/ 27 августа 2010

QDialog имеет свой собственный цикл сообщений, и, поскольку он останавливает рабочий процесс вашего приложения, я обычно использую следующую схему:

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();
}
5 голосов
/ 30 августа 2010

В общем случае, если данные довольно просты, мне нравится создавать один или несколько пользовательских сигналов и излучать их по мере необходимости.Простые или сложные данные, я, как правило, предоставлю средства доступа к данным.Тогда в сложном случае я бы подключил слот к сигналу accepted и получил бы нужную информацию в этом слоте.Недостатком этого является то, что вам обычно нужно полагаться на сохранение указателя на диалоговое окно или использование хака sender(), чтобы выяснить, какой объект вызвал слот.

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