模式对话框
描述
阻塞同一应用程序中其它可视窗口输入的对话框。模式对话框有自己的事件循环,用户必须完成这个对话框中的交互操作,并且关闭了它之后才能访问应用程序中的其它任何窗口。模式对话框仅阻止访问与对话相关联的窗口,允许用户继续使用其它窗口中的应用程序。
显示模态对话框最常见的方法是调用其exec()函数,当用户关闭对话框,exec()将提供一个有用的返回值,并且这时流程控制继续从调用exec()的地方进行。通常情况下,要获得对话框关闭并返回相应的值,我们连接默认按钮,例如:”确定”按钮连接到accept()槽,”取消”按钮连接到reject()槽。另外我们也可以连接done()槽,传递给它Accepted或Rejected。
如当我们用QtCreator打开一个项目或文件时,会出现以下画面
我们可以正常点击模式对话框里的内容,并且可以放大和缩小对话框。
但是我们不能点击除了模式对话框以外的对话框,包括主界面,(当然可以点击其他程序的对话框,如QQ)
只有当我点击 打开 或 取消 后才能退出模式对话框,只有模式对话框退出后程序才能继续运行
以下的代码都以mainwindow为主基类
实例代码:主函数
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.setWindowTitle(QObject::tr("主界面"));
w.show();
QDialog *dlg=new QDialog(&w);
dlg->setWindowTitle(QObject::tr("模式对话框"));
dlg->exec();
qDebug()<<"退出模式对话框"<<endl;
w.setWindowTitle(QObject::tr("主界面模式对话框"));
return a.exec();
}
运行结果:
非模式对话框
描述
和同一个程序中其它窗口操作无关的对话框。在文字处理中的查找和替换对话框通常是非模式的,允许用户同时与应用程序的主窗口和对话框进行交互。调用show()来显示非模式对话框,并立即将控制返回给调用者。
如果隐藏对话框后调用show()函数,对话框将显示在其原始位置,这是因为窗口管理器决定的窗户位置没有明确由程序员指定,为了保持被用户移动的对话框位置,在closeEvent()中进行处理,然后在显示之前,将对话框移动到该位置。
我们不仅可以点击非模式对话框,还可以点击主界面
实例代码:
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.setWindowTitle(QObject::tr("主界面"));
w.show();
QDialog *dlg=new QDialog(&w);
dlg->setWindowTitle(QObject::tr("非模式对话框"));
dlg->show();
w.setWindowTitle(QObject::tr("主界面非模式对话框"));
qDebug() << QStringLiteral("非模式对话框可立即执行");
return a.exec();
}
半模式
调用setModal(true)或者setWindowModality(),然后show()。有别于exec(),show() 立即返回给控制调用者。
对于进度对话框来说,调用setModal(true)是非常有用的,用户必须拥有与其交互的能力,例如:取消长时间运行的操作。
也就是说,半模式介于模式和非模式之间,程序可以再打开半模式对话框后继续运行,但是不能点击主界面
实例代码:
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.setWindowTitle(QObject::tr("主界面"));
w.show();
QDialog *dlg=new QDialog(&w);
dlg->setWindowTitle(QObject::tr("半模式对话框"));
dlg->setModal(true);
dlg->show();
w.setWindowTitle(QObject::tr("主界面半模式对话框"));
qDebug() << QStringLiteral("半模式对话可立即执行");
return a.exec();
}