如何从QDialog返回数据?

时间:2012-02-08 14:02:18

标签: c++ oop qt qdialog

我正在尝试设计一个主窗口和一个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();
    }
};

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

3 个答案:

答案 0 :(得分:15)

我通常这样做:

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

答案 1 :(得分:5)

这种方式没问题,但你也可以考虑让DialogmyDialogFinished(bool, bool, bool)上的一个广告位发出MainWindow等信号,从而节省必须回拨给Dialog它完成后就这样了。

答案 2 :(得分:3)

另一种选择是在完成后将对话框传递给存储数据的位置。通常,我会在实例化对话框时执行此操作。

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