我正在尝试设计一个主窗口和一个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();
}
};
看起来很乱。有更好的设计吗?我错过了什么吗?
答案 0 :(得分:15)
我通常这样做:
myDialog = new Dialog();
if(myDialog->exec())
{
bool Opt1, Opt2, Opt3;
myDialog->GetOptions(Opt1, Opt2, Opt3);
DoSomethingWithThoseBooleans (Opt1, Opt2, Opt3);
}
答案 1 :(得分:5)
这种方式没问题,但你也可以考虑让Dialog
向myDialogFinished(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;
}