【Qt】窗口预览(2)——对话框
【Qt】窗口预览2——对话框1. 对话框介绍2. 创建自定义对话框3. 模态对话框4. Qt内置对话框4.1 QMessageBox消息对话框4.2 QColorDialog——颜色对话框4.2 QFileDialog文件对话框4.3QFontDialog字体对话框4.4QInputDialog输入对话框1. 对话框介绍对话框在我日常使用是很常见的就比如我们要删除一个文件或者软件的时候经常会弹出一个是否要删除的窗口又或者我们在安装一个软件的时候弹出来的一系列安装流程都是属于对话框的内容。对话框通常是⼀个顶层窗口出现在程序最上层用于实现短期任务或者简单的用户交互工作。Qt常用的内置对话框有QFiledialog文件对话框、QColorDialog颜色对话框、QFontDialog字体对话框、QInputDialog输入对话框和QMessageBox消息框。在创建一个对话框的时候我们就需要选择QDialog作为父类进行继承但是实际开发中我们一般不是直接在创建项目的时候继承自这个QDialog而是在代码中创建额外的类让这个额外的类继承在QDialog。也就是说我们的主窗口一般不会作为一个对话框但是主窗口可以再产生一些其他的对话框。示例通过点击主窗口的一个按钮换出对话框voidMainWindow::on_pushButton_clicked(){// 创建一个对话框QDialog*dialognewQDialog(this);dialog-setWindowTitle(这是一个对话框);dialog-resize(400,200);// 显示dialogdialog-show();}**注意**不同于其他控件此处的Dialog每按下一次按钮都会创建一个新的Dialog对象并显示出来。只要我们没有关闭主窗口那么之前创建出来的Dialog对象就没有进行销毁那么问题就出现了如果在主窗口没有销毁之前点击了很多次按钮创建了很多的对话框但是没有进行销毁就会出现内存泄漏的风险。所以上述代码需要进行修改我们想要的效果是当我们点击按钮的时候可以创建出一个对话框然后当我们点击对话框右上角的关闭按钮的时候可以delete掉这个Dialog这样就不会出现上面的情况了。所以Qt为了完成这个操作给QDialog设置一个属性可以通过这个属性完成该操作。voidMainWindow::on_pushButton_clicked(){// 创建一个对话框QDialog*dialognewQDialog(this);dialog-setWindowTitle(这是一个对话框);dialog-resize(400,200);// 显示dialogdialog-show();// 通过的设置属性将关闭窗口和delete进行关联dialog-setAttribute(Qt::WA_DeleteOnClose);}2. 创建自定义对话框创建自定义对话框有两种方法一种是使用代码代码的方式另一种通过图形化界面代的方式。方式一通过代码的方式首先我们需要自己创建一个继承QDialog的类这里选择继承QDialog如果没有选项就手动敲上去。dialog.h头文件#ifndefDIALOG_H#defineDIALOG_H#includeQDialogclass Dialog:public QDialog{Q_OBJECT public:Dialog(QWidget*parent);};#endif// DIALOG_Hmainwindow.h头文件#includedialog.hMainWindow::MainWindow(QWidget*parent):QMainWindow(parent),ui(new Ui::MainWindow){ui-setupUi(this);}MainWindow::~MainWindow(){delete ui;}voidMainWindow::on_pushButton_clicked(){Dialog*dialognewDialog(this);dialog-setWindowTitle(这是一个自定义对话框);dialog-resize(400,200);// 设置delete属性dialog-setAttribute(Qt::WA_DeleteOnClose);// 展示dialog-show();}dialog.cpp源文件#includedialog.h#includeQLabel#includeQPushButton#includeQVBoxLayoutDialog::Dialog(QWidget*parent):QDialog(parent){// 给自定义对话框添加一些控件QLabel*labelnewQLabel(点击按钮关闭对话框,this);QPushButton*buttonnewQPushButton(关闭,this);QVBoxLayout*layOutnewQVBoxLayout();this-setLayout(layOut);layOut-addWidget(label);layOut-addWidget(button);// 关联一个关闭按钮connect(button,QPushButton::clicked,this,Dialog::close);}方式二通过图形化界面的方式首先创建一个ui界面类选择模版此时Qt就会自动帮我们创建一个ui界面我们可以在这个ui界面设置我们对话框格式mainwindow.cpp源文件#includemainwindow.h#includeui_mainwindow.h#includedialog.hMainWindow::MainWindow(QWidget*parent):QMainWindow(parent),ui(new Ui::MainWindow){ui-setupUi(this);}MainWindow::~MainWindow(){delete ui;}voidMainWindow::on_pushButton_clicked(){Dialog*dialognewDialog(this);this-setAttribute(Qt::WA_DeleteOnClose);dialog-show();}dialog.cpp源文件#includedialog.h#includeui_dialog.hDialog::Dialog(QWidget*parent):QDialog(parent),ui(new Ui::Dialog){ui-setupUi(this);}Dialog::~Dialog(){delete ui;}voidDialog::on_pushButton_clicked(){this-close();}3. 模态对话框对话框模态分为模态和非模态模态就是弹出对话框的时候次使用户无法操作父窗口必须完成对话框内部操作关闭对话框后才可以对父窗口进行操作非模态弹出对话框的时候用户可以对父窗口进行操作。而模态与非模态之间的转换也很简单只需要将show()改为exec()即可dialog-show();// 非模态dialog-exec();// 模态4. Qt内置对话框Qt中提供了多种可复用的对话框类型即Qt标准对话框。Qt标准对话框全部继承于QDialog类。常用标准对话框如下4.1 QMessageBox消息对话框消息对话框是应用程序中最常用的界面元素。消息对话框主要用于为用户提示重要信息强制用户进进行选择操。QMessageBox类中定义了静态成员函数可以直接调用创建不同风格的消息对话框其中包括消息风格描述Question用于正常的操作过程中的提问Information用于报告正常运行信息Warning用于报告非关键报错Critical用于报告严重错误可以自定义自定义按钮voidMainWindow::on_pushButton_clicked(){// 创建QMessageBox兑换矿QMessageBox*messageBoxnewQMessageBox(this);messageBox-setWindowTitle(QMessageBox对话框);messageBox-setText(这是一对话框文本);messageBox-setIcon(QMessageBox::Warning);// 设置按键//messageBox-setStandardButtons(QMessageBox::Ok | QMessageBox::Save | QMessageBox::Cancel);// 设置内置的按钮QPushButton*buttonnewQPushButton(OK,messageBox);messageBox-addButton(button,QMessageBox::AcceptRole);// 一般使用模态对话框messageBox-exec();messageBox-setAttribute(Qt::WA_DeleteOnClose);}上述的addButton有两个参数QPushButton*addButton(constQStringtext,ButtonRole role);QPushButton*addButton(StandardButton button);ButtonRole我们鼠标点击它然后按F1进入文档格式第二个参数表示按下按钮的属性是统一还是拒绝还是其他的以下是官方文档。上面的自定义按钮我们也可以给他关联一个槽函数当我们点击按钮的时候触发但是这样做起来显然有点麻烦Qt中有更方便的方式来处理点击事件。就是使用内置的按钮然后根据exec的返回值来判断按的是哪个按钮。代码展示#includemainwindow.h#includeui_mainwindow.h#includeQMessageBoxMainWindow::MainWindow(QWidget*parent):QMainWindow(parent),ui(new Ui::MainWindow){ui-setupUi(this);}MainWindow::~MainWindow(){delete ui;}voidMainWindow::on_pushButton_clicked(){// 创建QMessageBox兑换矿QMessageBox*messageBoxnewQMessageBox(this);messageBox-setWindowTitle(QMessageBox对话框);messageBox-setText(这是一对话框文本);// 设置图标messageBox-setIcon(QMessageBox::Warning);// 设置内置的按键messageBox-(QMessageBox::Ok|QMessageBox::Save|QMessageBox::Cancel);// 一般使用模态对话框exec()会返回一个int类型的值就是设置内置按钮中MessageBox::Ok | QMessageBox::Save | QMessageBox::Cancel这三个之中的一个值intresultmessageBox-exec();if(resultQMessageBox::Ok){qDebug()QMessageBox::Ok;}elseif(resultQMessageBox::Save){qDebug()QMessageBox::Save;}elseif(resultQMessageBox::Cancel){qDebug()QMessageBox::Cancel;}messageBox-setAttribute(Qt::WA_DeleteOnClose);}qt中内置了很多的按钮以下是官方文档的内容QMessageBox还提供了很多的静态函数直接可以创建出MessageBoxvoidMainWindow::on_pushButton_clicked(){// 这个静态函数会返回一个QMessageBox::Standardutton本质上就是QMessageBox::Ok | QMessageBox::Cancel中的某有一个其实也就是int类型的格式intresultQMessageBox::warning(this,对话框,这是使用静态函数创建的对话框,QMessageBox::Ok|QMessageBox::Cancel);if(resultQMessageBox::Ok){qDebug()ok;}else{qDebug()save;}}4.2 QColorDialog——颜色对话框颜色对话框的功能是允许用户选择颜色。继承自QDialog类。颜色对话框如下图常用方法介绍QColorDialog(QWidget*parentnullptr) //创建对象的同时设置父对象QColorDialog(const QColor initial,QWidget *parentnullptr) //创建对象的同时通过QColor对象设置默认颜色和父对象void setCurrentColor(const QColor color) //设置当前颜⾊对话框QColor currentColor() const//获取当前颜色对话框QColor getColor(const QColor initialQt::white,QWidget *parentnullptr,const QString titleQString(),QColorDialog::ColorDialogOptions optionsColorDialogOptions()) //打开颜色选择对话框并返回⼀个QColor对象voidMainWindow::on_pushButton_clicked(){// 通过QColorDialog::getColor函数设置QColor colorQColorDialog::getColor(QColor(0,255,0),this,选择颜色);qDebug()color;// 通过QSS的获得颜色然后设置窗口颜色QString stylebackground-color: rgb(QString::number(color.red()), QString::number(color.green()), QString::number(color.blue()));;this-setStyleSheet(style);}4.2 QFileDialog文件对话框文件对话框用于应⽤程序中需要打开⼀个外部文件或需要将当前内容存储到指定的外部文件。常用方法介绍函数作用static QString getOpenFileName(QWidget *parent nullptr, const QString caption QString(),const QString dir QString(),const QString filter QString(),QString *selectedFilter nullptr,Options options Options());打开文件只能打开一个文件static QStringList getOpenFileNames(QWidget *parent nullptr,const QString caption QString(), const QString dir QString(), const QString filter QString(), QString *selectedFilter nullptr, Options options Options());打开文件可以打开多个文件static QString getSaveFileName(QWidget *parent nullptr, const QString caption QString(), const QString dir QString(), const QString filter QString(), QString *selectedFilter nullptr, Options options Options());保存文件参数说明参数1parent父亲参数2caption对话框标题参数3dir默认打开的路径参数4filter文件过滤器voidMainWindow::on_pushButton_clicked(){QString fileNameQFileDialog::getOpenFileName(this);qDebug()fileName;}voidMainWindow::on_pushButton_2_clicked(){QString fileNameQFileDialog::getSaveFileName(this);qDebug()fileName;}4.3QFontDialog字体对话框Qt中提供了预定义的字体对话框类QFontDialog用于提供选择字体的对话框部件。使用静态函数getFont设置字体。voidMainWindow::on_pushButton_clicked(){bool okfalse;QFont fontQFontDialog::getFont(ok);qDebug()font;// 设置按钮的字体ui-pushButton-setFont(font);}4.4QInputDialog输入对话框Qt中提供了预定义的输入对话框类QInputDialog用于进行临时数据输人的场合。常用的静态函数如下参数说明parent父亲title对话框标题label对话框标签items可供选择的条目voidMainWindow::on_pushButton_clicked(){intresultQInputDialog::getInt(this,整数输入框,输入一个整数);qDebug()result;}