如何从QDialog返回数据?

10

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

看起来很乱。 有更好的设计吗? 我是否漏掉了什么?


4
如果你创建一个简单的结构体来打包这三个布尔值并从GetOptions返回它,就可以使代码看起来不那么凌乱。但除此之外,这种技术是可行的。 - Mat
3个回答

17

通常我会这样做:

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

5

这种方式是可行的,但你也可以考虑让 Dialog 发出一个信号,例如 myDialogFinished(bool, bool, bool)MainWindow 上的一个插槽,这样就不必在完成后回调到 Dialog 了。


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

我不确定您是否可以覆盖QDialogaccepted信号? - scmg

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