目录
5. 对话框
5.1 对话框介绍
用例1:
用例2:
用例3:
用例4:
5.2 对话框的分类
5.2.1 模态对话框
5.2.2 ⾮模态对话框
5. 对话框
5.1 对话框介绍
对话框是 GUI 程序中不可或缺的组成部分。⼀些不适合在主窗⼝实现的功能组件可以设置在对话框 中。对话框通常是⼀个顶层窗⼝,出现在程序最上层,⽤于实现短期任务或者简洁的⽤⼾交互。Qt常 ⽤的内置对话框有:QFiledialog(⽂件对话框)、QColorDialog(颜⾊对话框)、QFontDialog (字体对话框)、QInputDialog (输⼊对话框)和 QMessageBox(消息框) 。
用例1:

直接运行

用例2:


#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDialog>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_pushButton_clicked()
{QDialog* dialog = new QDialog(this);dialog->setWindowTitle("对话框的标题");// 设置对话框的尺寸dialog->resize(400, 300);// 通过 show 方法就可以显示出对话框.dialog->show();// delete dialog;// 正确做法应该是把 delete 和关闭按钮的点击信号关联起来.// 在用户点击关闭的时候, 触发 delete.// Qt 为了让咱们写的方便, 直接给 QDialog 设置了一个属性, 可以通过设置属性, 完成上述效果.dialog->setAttribute(Qt::WA_DeleteOnClose);
}

要是这样写,一点击对话框就会闪退,因为在函数内创建对话框又删除对话框
用例3:










dialog.h
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "dialog.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_pushButton_clicked()
{Dialog* dialog = new Dialog(this);dialog->setWindowTitle("自定义对话框");dialog->resize(400, 300);dialog->setAttribute(Qt::WA_DeleteOnClose);dialog->show();
}
dialog.cpp
#include "dialog.h"
#include <QPushButton>
#include <QLabel>
#include <QVBoxLayout>Dialog::Dialog(QWidget* parent) : QDialog(parent)
{// 创建出一些控件, 加入到 Dialog 中. (以 Dialog 作为父窗口)QVBoxLayout* layout = new QVBoxLayout();this->setLayout(layout);QLabel* label = new QLabel("这是一个对话框", this);QPushButton* button = new QPushButton("关闭", this);layout->addWidget(label);layout->addWidget(button);connect(button, &QPushButton::clicked, this, &Dialog::handle);
}void Dialog::handle()
{this->close();
}
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "dialog.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_pushButton_clicked()
{Dialog* dialog = new Dialog(this);dialog->setWindowTitle("自定义对话框");dialog->resize(400, 300);dialog->setAttribute(Qt::WA_DeleteOnClose);dialog->show();
}
用例4:
创建窗口项目
mianwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "dialog.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_pushButton_clicked()
{// 弹出一个自定义的对话框了Dialog* dialog = new Dialog(this);dialog->setAttribute(Qt::WA_DeleteOnClose);// dialog->show();dialog->exec();
}
5.2 对话框的分类
对话框分为 模态对话框 和 ⾮模态对话框。
5.2.1 模态对话框
模态对话框指的是:显⽰后⽆法与⽗窗⼝进⾏交互,是⼀种阻塞式的对话框。使⽤ QDialog::exec() 函 数 调⽤。
模态对话框适⽤于必须依赖⽤⼾选择的场合,⽐如消息显⽰,⽂件选择,打印设置等。
⽰例:
1、新建 Qt 项⽬,在 ui ⽂件中的菜单栏中设置两个菜单:"⽂件" 和 "编辑",在 菜单 "⽂件" 下新建
菜单项:"创建" 并将菜单项 "新建" 置于⼯具栏中 ; 如下图⽰

2、在 mainwindow.cpp ⽂件中实现:当点击 "新建" 时,弹出⼀个模态对话框;
说明:在菜单项中,点击菜单项时就会触发 triggered() 信号

5.2.2 ⾮模态对话框
⾮模态对话框显⽰后独⽴存在,可以同时与⽗窗⼝进⾏交互,是⼀种⾮阻塞式对话框,使⽤
QDialog::show()函数调⽤。
⾮模态对话框⼀般在堆上创建,这是因为如果创建在栈上时,弹出的⾮模态对话框就会⼀闪⽽过。同 时还需要设置 Qt:WA_DeleteOnClose 属性,⽬的是:当创建多个⾮模态对话框时(如打开了多个⾮ 模态窗⼝),为了避免内存泄漏要设置此属性。
⾮模态对话框适⽤于特殊功能设置的场合,⽐如查找操作,属性设置等。
⽰例:

5.2.3 混合属性对话框
混合属性对话框同时具有模态对话框和⾮模态对话框的属性,对话框的⽣成和销毁具有⾮模态对话框 属性,功能上具有模态对话框的属性。
使⽤ QDialog::setModal() 函数 可以创建混合特性的对话框。通常,创建对话框时需要指定对话框的 ⽗组件。
⽰例:
