【问题标题】:How to return data from QDialog?如何从 QDialog 返回数据?
【发布时间】:2023-10-21 07:51:01
【问题描述】:

我正在尝试设计一个主窗口和一个 QDialog,并找到从QDialog 返回数据的最佳方式。

现在我正在从对话框中捕获accepted() 信号,之后我调用返回数据的对话框函数。有没有更好的办法?

这是我现在拥有的工作代码:

class MainWindow : public QMainWindow
{
// ...

public slots:
    void showDialog()
    {
        if (!myDialog)
        {
            myDialog = new Dialog();
            connect(myDialog, SIGNAL(accepted()), this, SLOT(GetDialogOutput()));
        }
        myDialog->show();
    }
    void GetDialogOutput()
    {
        bool Opt1, Opt2, Opt3;
        myDialog->GetOptions(Opt1, Opt2, Opt3);
        DoSomethingWithThoseBooleans (Opt1, Opt2, Opt3);
    }

private:
    void DoSomethingWithThoseBooleans (bool Opt1, bool Opt2, bool Opt3);
    Dialog * myDialog;

};

还有对话框:

class Dialog : public QDialog
{
// ...

public:
    void GetOptions (bool & Opt1, bool & Opt2, bool & Opt3)
    {
        Opt1 = ui->checkBox->isChecked();
        Opt2 = ui->checkBox_2->isChecked();
        Opt3 = ui->checkBox_3->isChecked();
    }
};

看起来很乱。有更好的设计吗?我错过了什么吗?

【问题讨论】:

  • 如果您创建一个简单的结构来打包这三个布尔值并从 GetOptions 返回它,那么看起来会不那么混乱;但除此之外,技术还不错。

标签: c++ oop qt qdialog


【解决方案1】:

这种方式很好,但您也可以考虑让DialogMainWindow 上的插槽发出诸如myDialogFinished(bool, bool, bool) 之类的信号,这样就不必在以这种方式完成后回调Dialog

【讨论】:

    【解决方案2】:

    还有一个选项是在对话框完成后向对话框传递一个存储数据的位置。通常,我会在对话框的实例化期间执行此操作。

    class Dialog : public QDialog
    {
    public:
        Dialog(DialogResult* a_oResult) : m_oResult(a_oResult) {}
    
    signals:
        void accepted()
        {
            DialogResult result;
            // get results into 'result'
            *m_oResult = result;
        }
    private:
        DialogResult *m_oResult;
    }
    

    【讨论】:

    • 我不确定你是否可以覆盖QDialogaccepted信号??
    【解决方案3】:

    我通常这样做:

    myDialog = new Dialog();
    if(myDialog->exec())
    {
        bool Opt1, Opt2, Opt3;
        myDialog->GetOptions(Opt1, Opt2, Opt3);
        DoSomethingWithThoseBooleans (Opt1, Opt2, Opt3);
    }
    

    【讨论】: