C++ 如何从QDialog传递数据?

C++ 如何从QDialog传递数据?,c++,oop,qt4,dialog,signals,C++,Oop,Qt4,Dialog,Signals,在Qt中,当您需要传递比布尔或整数返回码更复杂的数据时,将数据从QDialog子类传递到启动对话框的组件的最优雅方式是什么 我想从accept()插槽发出一个自定义信号,但是还有其他东西吗?QDialog有自己的消息循环,因为它会停止您的应用程序工作流,我通常使用以下方案: MyQDialog dialog(this); dialog.setFoo("blah blah blah"); if(dialog.exec() == QDialog::Accepted){ // You can ac

在Qt中,当您需要传递比布尔或整数返回码更复杂的数据时,将数据从QDialog子类传递到启动对话框的组件的最优雅方式是什么


我想从
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();
}

在一般情况下,如果数据相当简单,我喜欢创建一个或多个自定义信号,并根据需要发出这些信号。简单或复杂的数据,我通常会提供数据的访问器。在复杂的情况下,我会将一个插槽连接到
接受的
信号,并在该插槽中获得所需的信息。这样做的缺点是,您通常需要依靠存储指向对话框的指针,或者使用
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.
}

如果对话框是模态的,则为真。。。在我的例子中是这样的,但我只是在想,在非模态对话框中你会怎么做?我想将对话框的接受信号连接到一个插槽,在该插槽中您可以执行与上面相同的操作。因此,无需从
accept()
插槽发出自定义信号。
connect
信号似乎是合适的。