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

3 回答 3

17

我通常这样做:

myDialog = new Dialog();
if(myDialog->exec())
{
    bool Opt1, Opt2, Opt3;
    myDialog->GetOptions(Opt1, Opt2, Opt3);
    DoSomethingWithThoseBooleans (Opt1, Opt2, Opt3);
}
于 2012-02-09T07:50:53.400 回答
5

这种方式很好,但你也可以看看Dialog发出一个信号,比如myDialogFinished(bool, bool, bool)一个 slot on ,这样就不用在它完成后MainWindow回调了。Dialog

于 2012-02-08T14:17:34.590 回答
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;
}
于 2012-02-08T15:22:45.060 回答