如何从QDialog传递数据?

9
在Qt中,当你需要传递比布尔值或整数返回代码更复杂的内容时,在QDialog子类和启动对话框的组件之间传递数据的最优雅方式是什么?我认为可以从accept()槽中发出自定义信号,但还有其他方法吗?请注意保留HTML标记。
2个回答

15

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信号连接到一个槽里面,在这个槽里面做和上面一样的事情。 - teukkam
所以,不需要从accept()插槽中发出自定义信号。connect信号似乎是合适的。 - tibur

5
一般情况下,如果数据比较简单,我喜欢创建一个或多个自定义信号,并在必要时发出这些信号。对于简单或复杂的数据,我通常会提供数据访问器。在复杂情况下,我会将槽连接到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.
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接