在Qt中,在需要传递比布尔值或整数返回代码更复杂的东西的情况下,将数据从QDialog子类传递到启动对话框的组件的最优雅方法是什么?
我正在考虑从accept()
广告位发出自定义信号,但还有其他信息吗?
答案 0 :(得分:11)
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();
}
答案 1 :(得分:5)
在一般情况下,如果数据非常简单,我想创建一个或多个自定义信号并根据需要发出这些信号。简单或复杂的数据,我通常会提供数据的访问器。在复杂的情况下,我会将一个插槽连接到accepted
信号,并在该插槽中获得所需的信息。这样做的缺点是你通常需要依赖存储指向对话框的指针,或使用sender()
hack来确定哪个对象触发了插槽。
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.
}