QT模态对话框和非模态对话框区别以及常用标准对话框
1.概述
这篇文章介绍下对话框的分类,它分为模态对话框和非模态对话框。
模态对话框:打开对话框后,不能操作其他窗口
非模态对话框:打开对话框后,可以操作其他窗口
2.模态和非模态对话框示例
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDialog>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
//
/*点击新建按钮弹出一个对话框
* 对话框分为
* 模态对话框: 对话框打开后,不可以操作其他窗口
* 非模态对话框: 对话框打开后,可以操作其他窗口
*/
connect(ui->actionnew, &QAction::triggered,[=](){
// 模态对话框创建
QDialog dlg(this);
dlg.resize(300,200);
// dlg.exec();
qDebug() << "模态对话框弹出";
// 非模态对话框创建
// 将对话框对象创建在栈上,因为它不是阻塞的,改行代码运行结束后栈内存就回收了,所以看不到弹出的对话框
QDialog dlg2(this);
dlg2.resize(300,200);
// dlg.show();
//将对话框对象创建在堆上,就可以看到对话框。
QDialog * dlg3 = new QDialog(this);
/*
* 创建在对上的对象只有在关闭QWidget窗口时才会回收堆内存对象,如果没有关闭QWidget窗口,一直点击新建再关闭对话框会造成内存泄漏。
* 使用setAttribute(Qt::WA_DeleteOnClose) 属性可以设置关闭对话框就释放堆内存上的对话框对象。
*/
dlg3->setAttribute(Qt::WA_DeleteOnClose);
dlg3->show();
});
}
MainWindow::~MainWindow()
{
delete ui;
}
3.标准对话框
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDialog>
#include <QDebug>
#include <QMessageBox>
#include <QColorDialog>
#include <QFileDialog>
#include <QFontDialog>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
//
/*点击新建按钮弹出一个对话框
* 对话框分为
* 模态对话框: 对话框打开后,不可以操作其他窗口
* 非模态对话框: 对话框打开后,可以操作其他窗口
*/
connect(ui->actionnew, &QAction::triggered,[=](){
// 模态对话框创建
QDialog dlg(this);
dlg.resize(300,200);
// dlg.exec();
qDebug() << "模态对话框弹出";
// 非模态对话框创建
// 将对话框对象创建在栈上,因为它不是阻塞的,改行代码运行结束后栈内存就回收了,所以看不到弹出的对话框
QDialog dlg2(this);
dlg2.resize(300,200);
// dlg.show();
//将对话框对象创建在堆上,就可以看到对话框。
QDialog * dlg3 = new QDialog(this);
/*
* 创建在对上的对象只有在关闭QWidget窗口时才会回收堆内存对象,如果没有关闭QWidget窗口,一直点击新建再关闭对话框会造成内存泄漏。
* 使用setAttribute(Qt::WA_DeleteOnClose) 属性可以设置关闭对话框就释放堆内存上的对话框对象。
*/
dlg3->setAttribute(Qt::WA_DeleteOnClose);
// dlg3->show();
});
// 标准消息框
// 错误提示框
QMessageBox::critical(this,"错误提示框","错误");
// 消息框
QMessageBox::information(this,"消息","消息提示框");
// 警告对话框
QMessageBox::warning(this,"警告","警告内容");
// 提问框
/*
* 参数说明:
* 参数1:QWidget 对象
* 参数2:标题
* 参数3:内容
* 参数4:对话框按钮名称
* 参数5:设置默认对话框按钮
*/
QMessageBox::StandardButton status = QMessageBox::question(this,"提问","提问题",QMessageBox::Help|QMessageBox::Close,QMessageBox::Close);
// 判断用户点击了哪个按钮
if(status == QMessageBox::Help){
qDebug() << "点击了帮助";
}else{
qDebug() << "点击了取消";
}
// 颜色提示框
QColor color = QColorDialog::getColor(QColor(255,0,0));
qDebug() << "r" << color.red() << "g" << color.green() << "b" << color.blue();
// 文件对话框
// 参数1:父类,参数2:标题,参数3:路径,参数4:过滤器显示指定内容
// 返回值是选择的路径
QString file = QFileDialog::getOpenFileName(this,"打开文件","/Users/bruce/Downloads","*.png");
qDebug() << "文件对话框:" << file;
// 字体对话框
bool flag;
QFont font = QFontDialog::getFont(&flag,QFont("华文彩云", 36));
qDebug() << "字体" << font.family() << "字号" << font.pointSize() << "是否加粗" << font.bold() << "是否倾斜" << font.italic();
}
MainWindow::~MainWindow()
{
delete ui;
}