对话框分类:对话框分模态对话框和非模态对话框,模态和非模态对话框对应的都是QDialog类

 

模态对话框

模态对话框是阻塞对话框,模态对话框打开时,会阻塞进程,除了模态对话框外,其他对话框无法选中也无法操作。

 

非模态对话框

非模态对话框是非阻塞对话框,非模态对话框打开时不影响进程,可以选中或者在其他对话框编辑,非模态对话框本身也可以移动。

 

打开模态对话框

要想打开模态对话框,只需要调用QDialog类的exec()方法。

int main()
{
    QDialog dlg;
    dlg.exec();                       //启用模态对话框
}

 

打开非模态对话框

要想打开模态对话框,只需要调用QDialog类的show()方法。

 

int main()
{
    QDialog dlg;
    dlg.show();                       //启用非模态对话框
}

 但是对于非模态对话框,上面的代码是有问题的,对话框会一闪而过,原因是非模态对话框是非阻塞的,而对象又是创建在栈区, 所以执行完show()方法后对话框对象就直接析构了,解决办法,将对话框创建在堆区。

int main()
{
    QDialog* dlg = new QDialog;
    dlg->show();                       //启用非模态对话框
}

如果有以下的一段代码,非模态对话框是通过点击按钮后在堆区创建的,那么只要主窗口不关闭,非模态对话框就不会析构,这块内存会一直存在,并且另外又创建了新的内存块,这样最终会导致内存泄漏。

示例

class MyWindow: public QMainWindow
{
public:
    MyWindow();

public slots:
    void createDialog();

public:
    QPushbutton btn;
};

MyWindow::MyWindow()
{
    connect(&btn, &QPushbutton::clicked, this, &MyWindow::createDialog);
}

void MyWindow::createDialog()
{
    QDialog* dlg = new QDialog;
    dlg->show();                                  //函数执行完后,内存被保留下来,没有其他地方来释放这块内存
}

为了解决上述问题,QT提供了一个属性,通过设置属性就可以在对话框关闭时自动析构。

示例

class MyWindow: public QMainWindow
{
public:
    MyWindow();

public slots:
    void createDialog();

public:
    QPushbutton btn;
};

MyWindow::MyWindow()
{
    connect(&btn, &QPushbutton::clicked, this, &MyWindow::createDialog);
}

void MyWindow::createDialog()
{
    QDialog* dlg = new QDialog;
    dlg->setAttribute(Qt::WA_DeleteOnClose);         //设置关闭后析构的属性,设置该属性后,当用户点击对话框的关闭按钮,对话框对象将自动析构
    dlg->show();
}

 

posted on 2020-09-28 14:56  大王背我来巡山®  阅读(95)  评论(0)    收藏  举报