Qt_对话框QDialog的介绍

ops/2024/9/23 6:39:12/

目录

1、新建项目对话框 

2、非模态对话框 

3、模态对话框

4、自定义对话框 

5、Qt内置对话框

5.1 消息对话框QMessageBox 

5.2 颜色对话框QColorDialog

5.3 文件对话框QFileDialog

5.4 字体对话框QFontDialog

5.5 输入对话框QInputDialog 

结语 


前言:

        在Qt中,对话框是图形化界面不可缺少的一部分,他的类是QDialog。对话框的作用是让用户处理临时、简洁的任务,通常让用户进行一些选择。对话框本质也是一个独立的窗口,他分为两类:1、模态对话框,2、非模态对话框。Qt中内置一些可以直接用的对话框,常用的有以下几种:QFiledialog(⽂件对话框)、QColorDialog(颜⾊对话框)、QFontDialog (字体对话框)、QInputDialog (输⼊对话框)和 QMessageBox(消息框)。当然还允许开发者继承QDialog类实现自定义对话框。

1、新建项目对话框 

        在Qt Creator中,可以在新建项目中选择新建QDialog类,如下图:

        新建完成后,运行程序可以得到一个界面,该界面的右上角有一个问号,表示该界面是对话框的基础界面:

        但是以上新建QDialog项目的做法是没有意义的,因为实际运用中对话框是以子窗口的身份出现在程序中的,往往是在主窗口中执行了某种逻辑,这时候才会跳出对话框,而上述将对话框作为主窗口则体现不出对话框的作用。因此下文的例子是在主窗口QMainWindow中通过new的形式,创建一个QDialog对象作为子窗口。

2、非模态对话框 

        非模态对话框是一种模式,表示对话框创建出来时不会限制用户对主窗口的操作,通俗来说,用户可以在对话框和主窗口之间进行切换,将这种模式称为非阻塞对话框。调用QDialog里的show()函数实现非模态对话框。

        实现一个按钮,只要该按钮被按下,则就会创建一个新的对话框,在QMainWindow.cpp实现代码如下:

#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->show();
}

        运行结果:

        可以看到能够正常创建对话框,但是上述代码有一个问题:如果关闭了对话框,是不会自动释放该对话框对象的,如果在一个主窗口中点击了多次按钮,就会一直创建新的对话框对象,从而导致内存泄漏。解决方法是设置 Qt:WA_DeleteOnClose 属性,写法如下:

void MainWindow::on_pushButton_clicked()
{//创建对话框QDialog* dialog = new QDialog(this);//采用非模态dialog->show();//效果为:关闭对话框时自动调用delete进行释放dialog->setAttribute(Qt::WA_DeleteOnClose);
}

3、模态对话框

        模态对话框表示弹出对话框时,用户只能在该对话框里进行操作,无法在该对话框存在的情况下去操作主窗口。使用模态对话框非常简单,将上述的show方法改成exec方法即可,代码如下:

#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->exec();//关闭对话框时自动调用delete进行释放dialog->setAttribute(Qt::WA_DeleteOnClose);
}

        运行结果:

4、自定义对话框 

        上述例子中的对话框仅仅只是一个窗口,无法添加任何控件,而一个完整的对话框是要有自己的控件的,这样才能与用户进行交互,若要实现在对话框中加入控件,方法之一就是自定义一个继承QDialog的类,然后在该类的构造函数中new出控件即可完成添加。步骤如下:

        新建完成后,会自动生成如下文件和代码:


        现在只需要在对应的文件中添加相关代码即可,dialog.h代码如下:

#ifndef DIALOG_H
#define DIALOG_H#include <QWidget>
#include <QDialog>class dialog : public QDialog
{Q_OBJECT
public:dialog(QWidget* parent);
};#endif // DIALOG_H

         dialog.cpp代码如下:

#include "dialog.h"
#include <QPushButton>
#include <QLabel>dialog::dialog(QWidget* parent):QDialog(parent)
{QLabel* label = new QLabel("对话框标签",this);QPushButton* pushbutton = new QPushButton("对话框按钮",this);pushbutton->move(200,200);
}

        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);dialog* di = new dialog(this);di->show();di->setAttribute(Qt::WA_DeleteOnClose);
}MainWindow::~MainWindow()
{delete ui;
}

        运行结果:

5、Qt内置对话框

         Qt内部提供了多种对话框类型,即Qt标准对话框,这些对话框的框架都已经设置好了,可以直接使用。Qt标准对话框全部继承自QDialog类,在QDialog的基础上进行功能添加,就如同一个自定义对话框,只不过他们的功能更加丰富。标准对话框如下图所示:

         注意:Qt内置对话框默认都具有模态性质的,即不需要调用exec函数就具有模态性质,同时也可以具有非模态的创建和销毁机制。

5.1 消息对话框QMessageBox 

        QMessageBox是图形化界面中常用的对话框,主要用于给用户展示某些信息,并强制用户进行选择操作。QMessageBox类中提供了setIcon()函数,该函数的作用是更改消息对话框的类型,通过传入QMessageBox提供的枚举类型来进行风格设置,有以下四种枚举对应四种风格:

Question
用于正常操作过程中的提问
Information
用于报告正常运⾏信息
Warning
用于报告⾮关键错误
Critical
用于报告严重错误

        测试代码如下:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMessageBox>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);//创建消息对话框QMessageBox* mes = new QMessageBox(this);//设置对话框标题mes->setWindowTitle("提示信息");//设置对话框的文本内容mes->setText("是否执行");//设置对话框类型mes->setIcon(QMessageBox::Information);//设置对话框的按钮mes->setStandardButtons(QMessageBox::Yes|QMessageBox::No);mes->show();//即使用show,这该对话框也是具有模态性质
}MainWindow::~MainWindow()
{delete ui;
}

        运行结果:

        从上述可以得知,消息对话框的框架是建立好了的,我们的工作就是对其风格进行设置。 


        上述代码逻辑可以简化成一句代码,该代码如下:

QMessageBox::information(this,"提示信息","是否执行",QMessageBox::Yes|QMessageBox::No);

        这句代码的实现和上述代码的实现是一样的,只不过这种写法无法更改对话框中的细节,灵活度不够高。

5.2 颜色对话框QColorDialog

         颜色对话框的作用就是让开发者在该对话框中选择一种颜色,然后拿到该颜色的RGB值,因为在程序中,颜色都是以数值的方式表现的,所以要想在代码中进行上色,必须使用RGB值,而开发者无法记住每一个RGB值代表什么颜色,因此需要一个颜色展示框(颜色对话框)来供开发者选择。

        QColorDialog常用接口介绍如下:

//该接口的作用是打开颜⾊选择对话框,并返回⼀个QColor对象,该对象保存RGB值QColor getColor(const QColor &initial = Qt::white, QWidget *parent = nullptr, 
const QString&title = QString(), 
QColorDialog::ColorDialogOptions options = ColorDialogOptions())//initial 表示给该颜色对话框设置一个初始的RGB
//parent 设置父对象
//title 设置对话框标题
//options 设置选项

        QColorDialog测试代码如下: 

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QColorDialog>
#include <QDebug>
#include <QPushButton>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);//创建一个按钮QPushButton* push = new QPushButton("按钮",this);//创建颜色对话框QColorDialog* color = new QColorDialog(this);//打开颜色对话框并获取到RGB值,该值存放在QColor的对象里,还可以设置对话框标题QColor c = color->getColor(QColor(0,255,0),this,"我们的颜色对话框");qDebug()<<c;//使用获取到的RGB值来设置按钮的颜色push->setStyleSheet("background-color:rgb("+ QString::number(c.red())+','+QString::number(c.green())+','+QString::number(c.blue())+");");
}MainWindow::~MainWindow()
{delete ui;
}

        运行结果:

        可以发现按钮的背景颜色变成了绿色,但是打印信息并不是0,255,0,这是因为打印的方式是ARGB(A表示不透明度,意思是将RGB的值采用透明度的方式来展现),其中1表示完全不透明度,后面是以三个小数来表示RGB的值,其中1就对应到RBG的255,0对应到RBG的0。

5.3 文件对话框QFileDialog

        ⽂件对话框用于界面中需要打开⼀个外部⽂件或需要将当前内容存储到指定的外部⽂件中。打开文件的接口介绍如下:

//该接口打开一个文件并返回该文件的路径
QString getOpenFileName(QWidget *parent = nullptr, const QString &caption = QString(),
constQString &dir = QString(), const QString &filter = QString(), 
QString *selectedFilter = nullptr,QFileDialog::Options options = Options())//parent 表示父对象
//caption 表示对话框标题
//dir 表示要打开的路径
//filter 表示文件过滤器

        测试代码如下: 

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QFileDialog>
#include <QPushButton>
#include <QDebug>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);//设置一个按钮,点击该按钮就跳出文件对话框QPushButton* push = new QPushButton("打开文件",this);//创建一个文件对话框对象QFileDialog* file = new QFileDialog(this);//用lambda来实现槽函数connect(push,&QPushButton::clicked,this,[=](){QString s = file->getOpenFileName(this);qDebug()<<s;});}MainWindow::~MainWindow()
{delete ui;
}

        运行结果:

         getOpenFileName不仅可以打开文件对话框,还可以返回选择文件的路径。


        保存文件用的函数是getSaveFileName,他的用法和打开文件是一样的,代码如下:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QFileDialog>
#include <QPushButton>
#include <QDebug>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);//设置一个按钮,点击该按钮就跳出文件对话框QPushButton* push = new QPushButton("保存文件",this);//创建一个文件对话框对象QFileDialog* file = new QFileDialog(this);//用lambda来实现槽函数connect(push,&QPushButton::clicked,this,[=](){QString s = file->getSaveFileName(this);qDebug()<<s;});}MainWindow::~MainWindow()
{delete ui;
}

        运行结果:

5.4 字体对话框QFontDialog

         字体对话框的使用逻辑和颜色对话框有效相似,都是为了让开发者能够清楚的选择某些选项,然后将这些选项保存在一个对象中,供后续的使用。常用接口介绍如下:

static QFont getFont(bool *ok, const QFont &initial, 
QWidget *parent = nullptr, 
const QString &title = QString(),
FontDialogOptions options = FontDialogOptions());//ok 表示对话框是否完成设置
//initial 表示设置对话框的默认值
//parent 表示对话框的父对象
//title 表示对话框标题
//options 表示对话框选项

        测试代码如下:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QFontDialog>
#include <QDebug>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);//创建一个文本对话框QFontDialog* font = new QFontDialog(this);//打开文本对话框,并设置默认值bool ok;QFont f = font->getFont(&ok,QFont("楷书",22),this);//打印fqDebug()<<ok;qDebug()<<f.family();//字体qDebug()<<f.pointSize();//字号qDebug()<<f.bold();//加粗qDebug()<<f.italic();//倾斜}MainWindow::~MainWindow()
{delete ui;
}

        运行结果:

5.5 输入对话框QInputDialog 

        输入对话框就是让用户输入一些简单的数值,比如整形数据、浮点型数据,常用的输入对话框类型有以下几种:

1、双精度浮点型输⼊数据对话框-调用getDouble函数

2、整型输⼊数据对话框-调用getInt函数

3、条⽬型输⼊对话框-调用getItem函数

        以上的函数参数用法和之前的逻辑都相差不差,只要看下面代码例子就知道如何使用了。 


        测试双精度浮点型对话框:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QInputDialog>
#include <QDebug>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);QInputDialog* input = new QInputDialog(this);double tmp = input->getDouble(this,"双精度输入框","请选择一个数值",10);qDebug()<<tmp;
}MainWindow::~MainWindow()
{delete ui;
}

        运行结果:

        可以点击右边的上下按钮对数值进行调整,也可以直接在输入框中自定义数值。


        整型对话框的逻辑和双精度浮点型对话框代码逻辑是一样的,只需要将函数更改为getInt就行,这里主要测试条目型输⼊对话框,这个对话框是选择字符串的,测试代码如下:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QInputDialog>
#include <QDebug>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);QInputDialog* input = new QInputDialog(this);//创建条目QStringList tmp;tmp<<tr("苹果")<<tr("香蕉")<<("西瓜");QString s = input->getItem(this,"整形输入框","请选择一个数值",tmp);qDebug()<<s;
}MainWindow::~MainWindow()
{delete ui;
}

        运行结果:

结语 

        以上就是关于对话框QDialog的介绍,对话框作为图形化界面常用的控件之一,自然是非常重要的,这一点可以在实际使用中感受得到。主要掌握内置对话框尤为重要,因为内置对话框的使用场景较多,并且其已经是成品了所以用起来也方便。

        最后如果本文有遗漏或者有误的地方欢迎大家在评论区补充,谢谢大家!! 


http://www.ppmy.cn/ops/114634.html

相关文章

MySQL缓冲池详解

Buffer Pool 本文参考开源项目&#xff1a;小林coding在线文档&#xff1b; 01-缓冲池概述 ​ 在MySQL查询数据的时候&#xff0c;是通过存储引擎去磁盘做IO来获取数据库中的数据&#xff0c;这样每次查询一条数据都要去做一次或者多次磁盘的IO&#xff0c;无疑是非常慢的。…

Python爬虫之urllib模块详解

Python爬虫入门 此专栏为Python爬虫入门到进阶学习。 话不多说&#xff0c;直接开始吧。 urllib模块 Python中自带的一个基于爬虫的模块&#xff0c;其实这个模块都几乎没什么人用了&#xff0c;我就随便写写了。 - 作用&#xff1a;可以使用代码模拟浏览器发起请求。&…

Spring Mybatis 基本使用 总结

1. 简介 Mybatis库可以简化数据库的操作&#xff0c;专注于sql语句。 2.搭建步骤 2.1 在pom.xml引入mybatis <dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.11</version> </dep…

4.《DevOps》系列K8S部署CICD流水线之Helm部署Harbor私人镜像仓库

架构 服务器IP服务名称硬件配置192.168.1.100k8s-master8核、16G、120G192.168.1.101k8s-node18核、16G、120G192.168.1.102k8s-node28核、16G、120G192.168.1.103nfs2核、4G、500G操作系统:Rocky9.3 后续通过K8S部署GitLab、Jenkins helm安装方式参考3.《DevOps》系列K8S部…

如何在 UniApp 中实现地图的视野自适应?

推荐学习文档 golang应用级os框架&#xff0c;欢迎stargolang应用级os框架使用案例&#xff0c;欢迎star案例&#xff1a;基于golang开发的一款超有个性的旅游计划app经历golang实战大纲golang优秀开发常用开源库汇总想学习更多golang知识&#xff0c;这里有免费的golang学习笔…

C++和OpenGL实现3D游戏编程【连载10】——纹理的半透明显示

1、本节实现的内容 上一节课我们讲到了图片的镂空显示,它能在显示图片时去除指定颜色的背景,那么这节课我们来说一下图片的半透明显示效果,半透明效果能给画面带来更高质量的提升,使图片显示的更自然,产生更真实的效果。下面是一个气泡向上漂浮的效果。 气泡效果 2、非纹…

Spring Cloud Alibaba-(5)Seata【分布式事务】

Spring Cloud Alibaba-&#xff08;1&#xff09;搭建项目环境 Spring Cloud Alibaba-&#xff08;2&#xff09;Nacos【服务注册与发现、配置管理】 Spring Cloud Alibaba-&#xff08;3&#xff09;OpenFeign【服务调用】 Spring Cloud Alibaba-&#xff08;4&#xff09;Sen…

【Proteus仿真】基于51单片机的宠物喂食系统设计

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于51单片机&#xff0c;两个按键调整重量阈值的大小&#xff0c;如果mpx4117压力传感器测重没超过阈值&#xff0c; 则电机转动&#xff0c;表示投喂&#xff0c;蜂鸣器发出滴滴声&#xff0c;如…