1、模态对话框和非模态对话框

QDialog类是所有对话框窗口类的基类,对话框窗口是一个经常用来完成短小任务或者和用户进行简单交互的顶层窗口。按照运行对话框是否可以和该程序其它窗口交互,对话框被称为:模态和非模态的。

  • 模态对话框 即在没有关闭之前,不能再与同一个应用程序的其它窗口进行交互,比如新建项目时弹出的对话框。要使一个对话框称为模态的,则只需要调用它的exec()函数。
  • 非模态对话框 即可以在同一程序中与他交互,如查找替换对话框。要使之称为非模态,可以先使用new 操作来创建QDialog,然后再使用->show()函数显示。

2、Qt Widget和Dialog区别和使用

  • 在开发过程发现子窗口的析构函数没有执行,后来查找发现,在创建对象的时候没有传递this指针
    例如Model *model = new Model();和Model *model =  new Model(this);this指针没有传递,因此无法调用子对象的析构函数。
    当子对象定义为指针,会出现因为没有被释放而无法被释放的现象,当关闭子窗体时不会调用析构函数,只有关闭父窗体时,才会调用子窗体的析构函数,可以设置this->setAttribute(Qt::WA_DeleteOnClose)来调用父类析构
    回到QWidget和QDialog的问题上,当我把子对象QWidget定义为指针时,因为父对象被关闭,导致子对象的指针无法被释放,析构函数不能被执行。而把QWidget子对象定义为局部变量的时候,窗口却一闪而过,因为子对象作为布局变量,很快就是系统释放了,所以窗口一闪而过。
    当子窗口继承QDialog的时候,因为QDialog起了一个事件循环exec,不会出现窗口一闪而过的现象。
    因此,当子窗口继承QWidget的时候,一定要注意指针的传递,如果父对象被关闭,可以通过设置子窗口this->setAttribute(Qt::WA_DeleteOnClose)来调用父类析构函数。