Qt_对话框QDialog的介绍

目录

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.xdnf.cn/news/1542721.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

使用Stream实现事件流

文章目录 1 概念介绍2 使用方法3 示例代码 我们在上一章回中介绍了Flutter中的异步操作&#xff0c;本章回中将介绍Flutter中的事件流.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1 概念介绍 我们在上一章回中介绍了异步操作相关的内容&#xff0c;本章回中将介绍如何把…

51.字符串比较实例-用户登录

//已知正确的用户名和密码&#xff0c;请用程序实现模拟用户登录 //总共三次机会&#xff0c;登录之后给出相应的提示 import java.util.Scanner;public class 登录 {public static void main(String[] args) {//1.定义两个变量&#xff0c;记录正确的用户名和密码String righ…

【kaggle竞赛】毒蘑菇的二元预测题目相关信息和思路求解代码

毒蘑菇的二元预测 您提供了很多关于不同二元分类任务的资源和链接&#xff0c;看起来这些都是Kaggle竞赛中的参考资料和高分解决方案。为了帮助您更好地利用这些资源&#xff0c;这里是一些关键点的总结&#xff1a; Playground Season 4 Episode 8 主要关注的竞赛: 使用银行…

深入理解 JavaScript 三大作用域:全局作用域、函数作用域、块级作用域

一. 作用域 对于多数编程语言&#xff0c;最基本的功能就是能够存储变量当中的值、并且允许我们对这个变量的值进行访问和修改。那么有了变量之后&#xff0c;应该把它放在哪里、程序如何找到它们&#xff1f;是否需要提前约定好一套存储变量、访问变量的规则&#xff1f;答案…

【线程池】ThreadPoolExecutor应用

ThreadPoolExecutor应用 每一步的坚持与积累,都是铸就高薪和大牛的必经的修炼 哈哈,不吹牛逼了,今天来分享最近在提升中的学习总结,无论是对在职场还是求职,看完,我相信都会有些许的收获和成长 也难得过了一个悠闲点的周末,哈哈哈,一起奥利给!! 本文总纲: 1.为什么要自定义线程…

java8 常用操作案例【经典版】超赞!

目录 一 案例 1.1 对象转list 1.2 过滤对象 1.3 排序 1.4 匹配 1.5 最大值最小值 1.6 拼接字符串 1.7 求和 1.8 分组 1.9 分组求和 1.10 综合案例 一 案例 1.1 对象转list /*** author admin对象转map ; mapper层实体类获取,到业务层转换为DTO,* return void…

《python语言程序设计》2018版第8章18题几何circle2D类(中部)

第一、重新分析 第一-1、我设计的第一模式第一-1-1、遇到的逻辑分析迷雾第一-1-2、无畏挣扎后的无奈 第二-1、我就把你们两个放到一起,第二-2、我的想法 当我看到了这个2个园并且比对. 第一-1、我设计的第一模式 设计一个最抽象的Circle2D类. 这个类只包含一个x,y和circle 这个…

初始C++中的string与迭代

常用的string构造相关类的接口 string类是一个管理字符串的字符数组&#xff0c;string类的出现方便管理我们日常所遇见的&#xff0c;字符名&#xff0c;字符串等等。下面们介绍一下常见的string类接口。 string(); 默认构造&#xff0c;构造空的string类 int main() { …

深度学习电脑独显GPU占用一直0%解决方式

在系统设置里面把硬件加速GPU计划关了 然后重启 再随便跑个模型 打开任务管理器可以看到独显开始工作了 再在GPU1中将3D改成Cuda即可

Vue项目之Element-UI(Breadcrumb)动态面包屑效果 el-breadcrumb

效果预览 需要导航的页面Vue.js 最笨的方法就是在每个需要面包屑的页面中固定写好 <template><div class="example-container"><el-breadcrumb separator="/"

【Linux-基础IO】C语言文件接口回顾 系统文件概念及接口

目录 一、C语言文件接口回顾 C语言基础知识 C中文件操作示例 二、系统文件概念及接口 重定向基本理解的回顾 文件的基本概念 系统调用接口 open read write close lseek 什么是当前路径 一、C语言文件接口回顾 引言&#xff1a;我们并不理解文件&#xff01;从语…

springboot实战学习(7)(JWT令牌的组成、JWT令牌的使用与验证)

接着上篇博客的学习。上篇博客是在基本完成用户模块的注册接口的开发以及注册时的参数合法性校验的基础上&#xff0c;基本完成用户模块的登录接口的主逻辑以及提到了问题&#xff1a;"用户未登录&#xff0c;需要通过登录&#xff0c;获取到令牌进行登录认证&#xff0c;…

TypeError: a bytes-like object is required, not ‘str‘ - 完美解决方法

&#x1f680;TypeError: a bytes-like object is required, not str - 完美解决方法&#x1f4a1; &#x1f680;TypeError: a bytes-like object is required, not str - 完美解决方法&#x1f4a1;摘要引言正文1. 错误背景&#xff1a;字节与字符串的区别&#x1f440;2. 错…

告别ESLint噩梦!轻松几步解决 indent 与 react/jsx-indent-props 的 空格 冲突!

话不多说&#xff0c;直接上代码&#xff0c;下面是截取的一部分 eslint 配置。可以看到我设置了四个空格和标签属性对齐首个。 "rules": {"indent": ["error", 4], // 四个空格"react/jsx-indent-props": ["error", "…

双虚拟机部署php项目

前言 经过前面的学习,我们对分布式部署有了一定的了解,这次我们尝试做些东西 准备 我打算用虚拟机部署一个外联网盘 一台虚拟机安装php另一台安装MySQL,但是之前已经安装过 MariaDB 了,就不打算改了。 通常MariaDB与MySQL兼容性很好,可以作为替代使用。彩虹外链网盘项目…

【C++11】异常处理

目录 一、异常的引入 二、C异常的关键字 三、异常的抛出与处理规则 四、异常缺陷的处理 五、自定义异常体系 六、异常规范 七、异常安全 八、异常的优缺点 1.优点 2.缺点 一、异常的引入 传统的C语言处理异常的方式有两种&#xff1a; 1.终止程序&#xff1a;使用as…

CSS 选择器的分类与使用要点一

目录 非 VIP 用户可前往公众号进行免费阅读 标签选择器 id 选择器 类选择器 介绍 公共类 CSS 中优先用 class 选择器,慎用 id 选择器 后代选择器 交集选择器 以标签名作为开头 以类名作为开头 连续交集 并集选择器(分组选择器) 通配符* 儿子选择器 >(IE7…

变量常量标识符

1. 变量 1.1 变量的概念 变量是计算机内存中的一块存储单元&#xff0c;是存储数据的基本单元变量的组成包括&#xff1a;数据类型、变量名、值&#xff0c;后文会具体描述变量的本质作用就是去记录数据的&#xff0c;比如说记录一个人的身高、体重、年龄&#xff0c;就需要去…

PP-HGNet(High Performance GPU Net)

发展历程&#xff1a; DenseNet -> VoVNet -> HGNet VoVNet是DenseNet的改进&#xff0c;如图&#xff1a; VoVNet论文网址&#xff1a; https://arxiv.org/pdf/1904.09730 HGNet模型简介 PP-HGNet(High Performance GPU Net) 是百度飞桨视觉团队自研的更适用于 GPU…

【AI大模型】对接LLM API

本章节主要介绍四种大语言模型&#xff08;ChatGPTAPI、文心一言、讯飞星火、智谱 GLM&#xff09;的 API 申请指引和 Python 版本的原生 API 调用方法。 文心一言&#xff1a;当前无赠送新用户 tokens 的活动&#xff0c;推荐已有文心 tokens 额度用户和付费用户使用&#xf…