qt如何动态关闭打开的模态对话框

最近在工作里遇到一个特殊的需求,就是切换模块的时候要关闭原来模块的所有对话框。这些对话框里有模态的,也有非模态的,还可能有用静态函数弹出的文件对话框。

开始是想用指针把它们都关掉,但后来发现每一个对话框都定义一个成员变量不仅维护繁琐还占用内存,不仅如此,文件对话框QFileDialog似乎还没有关闭的代码接口,done已经被设置为protect。

不过后来发现所有的对话框都是模块的子对象,于是乎事情就好办了。

用findchildren<QDialog*>的方法获取所有对话框对象的指针,对于所有显示了的dialog全部用done(QDialog::Rejected)把他们全部取消掉。

QList<QDialog*> lDialogs = pMain->findChildren<QDialog*>();

for(int nIndex = 0; nIndex < lDialogs.size(); nIndex++)

{

  QDialog* pDlg = lDialogs[nIndex];

  if(pDlg && pDlg->isVisible())

    pDlg->done(QDialog::Rejected);

}

编译测试,结果ok,只是做好在模态对话框退出事件循环的时候加个判断,以避免执行不希望执行的操作。

posted @ 2017-04-24 22:13  Mr.Ira  Views(88)  Comments(0)    收藏  举报