【问题标题】:How to pass data from a QDialog?如何从 QDialog 传递数据?
【发布时间】:2011-04-04 21:17:35
【问题描述】:

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

我正在考虑从accept() 插槽发出一个自定义信号,但还有别的吗?

【问题讨论】:

    标签: c++ oop qt4 dialog signals


    【解决方案1】:

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

    【讨论】:

    • 如果对话框是模态的,这是真的......在我的情况下是这样,但我只是在想你将如何在非模态对话框中执行此操作?我猜想将对话框接受的信号连接到一个插槽,您可以在其中执行与上述相同的操作。
    • 因此,无需从accept() 插槽发出自定义信号。 connect 信号似乎是合适的。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2012-02-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-01
      相关资源
      最近更新 更多