模态
当一个窗口以模态显示,那么所有其他窗口的事件都被阻塞(停止运行),直到模态窗口关闭后才继续。
MainWindow *pMainWindow = new MainWindow();
pMainWindow->setWindowTitle(QStringLiteral("主界面"));
pMainWindow->show();//非模态显示
CustomWindow *pDialog = new CustomWindow(pMainWindow);
pDialog->setWindowTitle(QStringLiteral("模式对话框"));
pDialog->exec();//exec就是模态显示,所有窗口停止执行,直到此窗口关闭
// 关闭模态窗口以后才会执行下面的代码
pMainWindow->setWindowTitle(QStringLiteral("主界面-模式对话框"));
qDebug() << QStringLiteral("关闭模态对话框以后,可以继续向下执行");
非模态
相反,多个窗口之间互不阻塞,允许多个窗口同时与用于进行交互。
MainWindow *pMainWindow = new MainWindow();
pMainWindow->setWindowTitle(QStringLiteral("主界面"));
pMainWindow->show();
CustomWindow *pDialog = new CustomWindow(pMainWindow);
pDialog->setWindowTitle(QStringLiteral("非模式对话框"));
pDialog->show();//show就是非模态,不像exec,show之后会马上继续向下执行代码
//要注意非模态窗口一般都要new,若是创建在栈上,代码会一直往下执行,如果出了作用域,窗口就被自动销毁了
pDialog->setAttribute(Qt::WA_DeleteOnClose)//设置关闭自动销毁,以免内容占用过多
// 下面的代码会立即运行
pMainWindow->setWindowTitle(QStringLiteral("主界面-非模式对话框"));
qDebug() << QStringLiteral("立即运行");
半模态
会阻塞其他窗口,但与模态不同的是代码会继续往下执行,而不是停止直到窗口关闭。
MainWindow *pMainWindow = new MainWindow();
pMainWindow->setWindowTitle(QStringLiteral("主界面"));
pMainWindow->show();
CustomWindow *pDialog = new CustomWindow(pMainWindow);
pDialog->setWindowTitle(QStringLiteral("半模式对话框"));
pDialog->setModal(true);
pDialog->show();//半模态窗口,代码会继续运行,但其他窗口无法进行交互
// 下面的代码会立即运行
pMainWindow->setWindowTitle(QStringLiteral("主界面-半模式对话框"));
qDebug() << QStringLiteral("立即运行");