Как передать данные из QDialog?

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

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

7
задан teukkam 27 August 2010 в 15:34
поделиться

2 ответа

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();
}
11
ответ дан 6 December 2019 в 12:45
поделиться

В общем случае, если данные достаточно просты, мне нравится создавать один или несколько пользовательских сигналов и выдавать их по мере необходимости. Простые или сложные данные, я обычно предоставляю средства доступа к данным. Тогда в сложном случае я бы подключил слот к сигналу 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.
}
5
ответ дан 6 December 2019 в 12:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: