QT笔记2__对话框类QDialog(模态和非模态)

版权声明:本文为博主原创文章, 欢迎转载,转载请注明出处。 https://blog.csdn.net/baicaidiaozhui/article/details/86687478


QDialog类是所有对话框窗口类的基类,对话框窗口是常用来完成简单任务或与用户完成简单交互的顶层窗口,QDialog继承自QWidget。

按照运行当前QDialog时,用户是否还能与应用程序其他窗口互交,可将对话框窗口分为模态对话框和非模态对话框。窗口的模态、非模态、半模态的显示方式主要从三个方面进行区分:显示方式、其他窗口阻塞情况、代码阻塞情况

1.模态对话框

1、其他窗口状态: 当对话框以模态形式显示时,该应用程序的其他窗口处于未激活状态,无法接受键盘和鼠标的操作,必须关闭模态对话框才能对其他窗口进行操作。
2、调用方式: 模态对话框一般采用exec()函数进行显示,当程序调用exec()显示窗口时候,代码在exec()处进行阻塞,需要关闭对话框,程序才会继续运行之后的代码;
3、代码阻塞情况: 当关闭模态对话框时,exec()具有返回值,一般将对话框界面上的"确定"按钮连接槽函数"accept()",“取消"按钮连接"reject()”;或者采用done(int r)函数设置返回值。
4、举例: 新建项目对话框;

//创建MainWindow主界面;
QMainWindow *my_MainWin = new QMainWindow();
my_MainWin->setWindowTitle(QString::fromLocal8Bit("我是主界面"));
my_MainWin->show();
//创建QDialog子窗口;
QDialog *my_Dlg = new QDialog(my_MainWin);
my_Dlg->setWindowTitle(QString::fromLocal8Bit("我是模式对话框"));
// 模式对话框显示
my_Dlg->exec();
// 关闭模态对话框以后才会执行下面的代码
my_MainWin->setWindowTitle(QString::fromLocal8Bit("主界面-模式对话框"));

2.非模态对话框

1、其他窗口状态 当对话框以非模态对话框显示时,该应用程序的其他窗口可以正常使用;
2、显示方式: 非模态对话框一般采用show()函数进行显示;
3、代码阻塞情况: 在调用非模态对话框之后,代码正常运行,不会在对话框显示处发生阻塞。
4、举例 word中的查找和替换对话框;

 QMainWindow *my_MainWin = new QMainWindow();
 my_MainWin->setWindowTitle(QString::fromLocal8Bit("我是主界面"));
 my_MainWin->show();
 //创建QDialog子窗口;
 QDialog *my_Dlg = new QDialog(my_MainWin);
 my_Dlg->setWindowTitle(QString::fromLocal8Bit("我是非模式对话框"));
 // 模态对话框显示
 my_Dlg->show();
 // 以下代码会继续执行
 my_MainWin->setWindowTitle(QString::fromLocal8Bit("主界面-非模式对话框"));

3.半模态对话框

半模态对话框一词是借用于博客一去二三里,由于该形式的对话框,介于模态对话框和非模态对话框之间,因此称为半模态也算是比较形象。

1、其他窗口状态: 当对话框以半模态形式显示时,该应用程序的其他窗口处于未激活状态,无法接受键盘和鼠标的操作,必须关闭该对话框才能对其他窗口进行操作。
2、显示方式: 调用setModal(true)或者setWindowModality(),然后show()。
3、代码阻塞情况: 在调用非模态对话框之后,代码正常运行,不会在对话框显示处发生阻塞。
4、举例: 进度条对话框;

//创建MainWindow主界面;
QMainWindow *my_MainWin = new QMainWindow();
my_MainWin->setWindowTitle(QString::fromLocal8Bit("我是主界面"));
my_MainWin->show();
//创建QDialog子窗口;
QDialog *my_Dlg = new QDialog(my_MainWin);
my_Dlg->setWindowTitle(QString::fromLocal8Bit("我是半模式对话框"));
// 非模态对话框显示
my_Dlg->setModal(true);
my_Dlg->show();
// 以下代码会继续执行
my_MainWin->setWindowTitle(QString::fromLocal8Bit("主界面-半模式对话框"));

4.窗口模态设置

  • setModal()函数:

    void setModal(bool modal);
    当modal为true时为模态窗口,false时为非模态窗口;

  • setWindowModality()函数:

    void setWindowModality(Qt::WindowModality windowModality);

    • Qt::NonModal:不阻塞任何窗口,非模态。
    • Qt::WindowModal:阻塞父窗口、所有祖先窗口以及子窗口。
    • Qt::ApplicationModal:阻塞整个应用程序所有窗口。
      setModal()函数的默认设置是,Qt::ApplicationModal。
  • 获取窗口模态性;
    • Qt::WindowModality windowModality() const; // 返回窗口的模态性
    • bool isModel() const; // 当窗口为模态窗口是返回true,否则为false

参考资料

1、《Qt creater 快速入门》

猜你喜欢

转载自blog.csdn.net/baicaidiaozhui/article/details/86687478