模态和非模态
模态对话框:在没有被关闭之前,用户不能与同一个应用程序的其他窗口进行交互,直到该对话框关闭。
非模态对话框:当被打开时,用户既可选择和该对话框进行交互,也可以选择同应用程序的其他窗口交互。
Qt中,显示一个对话框一般有两种方式,一种是使用exec()方法,它总是以模态来显示对话框,当运行的时候,你会发现当关闭这个对话框时,另一个对话框才显示;另一种是使用show()方法,它使得对话框既可以模态显示,也可以非模态显示,决定它是模态还是非模态的是对话框的modal属性。而model有独特的属性。
设置为非模态对话框,必须使用show()方法
这种情况如果点击主界面,主界面将会覆盖Dialog窗口,为解决这种方式,设置模态属性:
Dialog 窗口在调用exec前,先调用setWindowModality(Qt::WindowModal)这一句话
#include "dialog.h"
#include "ui_dialog.h"
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
this->setWindowFlags(Qt::Dialog);
}
Dialog::~Dialog()
{
delete ui;
}
模态下实现虚拟键盘
此时Dialog界面将不会被主窗口覆盖,除非关闭Dialog界面
此外如果需要在模态下实现虚拟键盘会造成虚拟键盘不可用的情况:
解决方案:
如果是dialog窗体,请在dialog窗体exec前增加一行代码,QDialog dialog;dialog.setWindowModality(Qt::WindowModal);否则会阻塞窗体消息。
Dialog dia(this);
dia.setWindowModality(Qt::WindowModal);
if (dia.exec() != QDialog::Accepted)
{
return;
}