QMainWindow,调用exec()实现QDialog阻塞效果
一般都优先使用QDialog作为子界面,调用exec()阻塞主界面,等待用户操作完成以后,获取返回的操作结果。
如果使用QMianWindow写子界面,添加菜单栏、工具栏比较方便,但是没办法阻塞主界面,并等待用户操作返回操作结果给主界面
一、解决办法:使用QEventLoop的exec()
1、子界面:
设置界面属性以及标志Qt::Tool,这个标志可以解决主界面最小化后,子界面不响应鼠标键盘事件的问题
setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint | Qt::Dialog | Qt::Tool);
setWindowModality(Qt::NonModal);
写一个函数,调用QEventLoop的exec()
void SubMainWindow::Exec()
{
show();
loop.exec();
}
然后在closeEvent()函数,以及需要关闭子界面的槽函数里面调用QEventLoop的quit()
void SubMainWindow::closeEvent(QCloseEvent *event)
{
printf(".......closeEvent......\n");
loop.quit();
}
2、主界面:
直接调用Exec()即可,不要把子界面和主界面关联,即子界面不要设置父类
SubMainWindow aa;
aa.Exec();