非模态对话框
• ⾮模态对话框显⽰后独⽴存在,可以同时与⽗窗⼝进⾏交互,是⼀种⾮阻塞式对话框,使⽤QDialog::show()函数调⽤。
对话框
QDialog 其实也是QWidget的子类,QWidget的各种属性方法,QDialog也能使用。
• 不同于界面上的其他控件,此处QDialog每次按下按钮,都会创建一个新的QDialog对象,并进行显示,每次点击都会创建新的对话框对象。这时就会 造成内存泄漏!
按钮的槽函数生成对话框代码
void MainWindow::on_pushButton_clicked()
{
//创建一个对话框
QDialog* dialog = new QDialog();
//设置对话框的尺寸和标题
dialog->resize(400,300);
dialog->setWindowTitle("这是一个对话框");
//通过show方法显示出对话框
dialog->show();
}
内存泄漏解决方法:
用对话框的关闭按钮来触发delete方法,使用delete方法来释放dialog。
void MainWindow::on_pushButton_clicked()
{
//创建一个对话框
QDialog* dialog = new QDialog();
//设置对话框的尺寸和标题
dialog->resize(400,300);
dialog->setWindowTitle("这是一个对话框");
//通过show方法显示出对话框
dialog->show();
//Qt中给出的方法,可以通过设置属性,完成对话框关闭按钮和对话框释放功能的关联。
dialog->setAttribute(Qt::WA_DeleteOnClose);
}
自定义对话框
代码创建自定义对话框
代码创建自定义对话框的时候,我们需要通过新建的类 dialog来继承QDialog,然后使用新建的类dialog的构造函数来创建自定义对话框。
//dialog.cpp
#include<QPushButton>
#include<QLabel>
#include<QVBoxLayout>
Dialog::Dialog(QWidget* parent):QDialog(parent)
{
//新建两个控件
QPushButton* button = new QPushButton("关闭", this);
QLabel* label = new QLabel("这是一个对话框", this);
//新建一个布局
QVBoxLayout* boxlayout = new QVBoxLayout(this);
//将控件添加到布局当中去
boxlayout->addWidget(label);
boxlayout->addWidget(button);
connect(button, &QPushButton::clicked, this, &Dialog::control);
}
void Dialog::control()
{
this->close();
}
图形化创建自定义对话框
图形化的方式就需要新建一个ui,我们自定义新建的ui即可,然后将新建的ui变成我们自定义的对话框
• 当我们新建一个UI的同时,会生成一个类,我们可以选择这个类继承自QDialog ,
• 然后我们再自定义的对这个类进行修改,添加一些控件之类的
• 最后再用这个类直接创建对话框,生成的就是我们自定义的对话框。
模态对话框
• 模态:弹出对话框的时候,无法操作父窗口,必须要完成对话框内部的操作,关闭对话框之后,才能操作对话框。
• 非模态:弹出对话框的时候也同样能操作父窗口。
如何产生模态对话框?
将 show方法换成 exec 方法。