您有很多不同的选择。其中一些可能不适用于您的情况:
案例 1:调用者最了解(即程序化编程)
定义一个可以控制排序的控制器。然后,该控件可以充当中介并在对话框关闭后获取数据:
void FlowController::displayFlow()
{
MyDialog *dialog = new MyDialog();
YourSharedData *data = NULL;
int result = dialog->exec();
if (result == QDialog::Accepted) {
data = dialog->sharedDataAccessor();
}
MyMainWindow *window = new MyMainWindow();
window->setSharedData(data);
window->exec();
}
案例 2:消息传递
预先创建对话框和主窗口。把对应的信号和槽连接起来,让它们互相不了解。这通常更容易测试和保持解耦:
void AppLauncher::launch()
{
MyDialog *dialog = new MyDialog();
MyMainWindow *window = new MyMainWindow();
window->connect(
dialog,
SIGNAL(dialogResult(int, const SharedData&)),
SLOT(setDialogResult(int,const SharedData&))
);
}
void MyMainWindow::setDialogResult(int result, const SharedData& sharedData)
{
if (result == Dialog::Accepted) // something domain-specific would be better
{
this->processSharedData(sharedData); // do whatever with it.
}
}
案例 3:共享状态依赖
预先定义您的共享数据并使其成为每个表单的依赖项。然后每种形式定义状态,基于该状态的行为,或两者的某种组合:
void AppLauncher::launch()
{
SharedData *data = this->createSharedData();
MyDialog *dialog = new MyDialog(data);
MyMainWindow *window = new MyMainWindow();
dialog->exec(); // does what it needs with shared data
window->exec(); // checks shared data and acts accordingly
}
案例 4:MVC / MVP / MVVM
您也许可以将您的共享状态定义为他们都采取行动的模型。这可能与上述情况三没有太大区别。
案例 4:单例或全局状态
它会起作用,但是please don't do it :)。