Самый элегантный способ передачи данных из подкласса QDialog компоненту, запустившему диалог, в Qt в тех случаях, когда вам нужно передать что-то более сложное, чем логическое или целочисленный код возврата?
Я думаю, что из слота accept ()
будет выдан специальный сигнал, но есть ли что-нибудь еще?
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();
}
В общем случае, если данные достаточно просты, мне нравится создавать один или несколько пользовательских сигналов и выдавать их по мере необходимости. Простые или сложные данные, я обычно предоставляю средства доступа к данным. Тогда в сложном случае я бы подключил слот к сигналу 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.
}