【Qt窗口】—— 对话框

ops/2024/9/19 12:04:43/ 标签: qt, 开发语言

目录

(一) 对话框介绍

(二)对话框的分类

2.1 模态对话框 

2.2 非模态对话框

2.3 混合属性对话框

(三)内置对话框

消息对话框 QMessageBox

颜色对话框 QColorDialog

 字体对话框 QFontDialog

输入对话框 QInputDialog

文件对话框 QFiledialog

总结


(一) 对话框介绍

我们有的时候打开某些网站,不经意间可能就会弹出各种奇奇怪怪的窗口,这个就可以叫做“对话框”,对话框往往在用户与用户之间进行“短平快” 的操作。

对话框是GUI程序中不可或缺的组成部分。⼀些不适合在主窗⼝实现的功能组件可以设置在对话框 中。对话框通常是⼀个顶层窗口,出现在程序最上层,⽤于实现短期任务或者简洁的用户交互。

Qt常用的内置对话框有:

  • QMessageBox(消息框)
  • QColorDialog(颜色对话框)
  • QFontDialog (字体对话框)
  • QInputDialog(输入对话框)
  • QFiledialog(文件对话框)

(二)对话框的分类

对话框主要可以分为模态对话框⾮模态对话框 。

2.1 模态对话框 

模态对话框指的是:显示后无法与父窗口进行交互,是⼀种阻塞式的对话框。使用QDialog::exec()函数调用。

模态对话框适用于必须依赖用户选择的场合,⽐如消息显示,文件选择,打印设置等。

 示例:

  • 1、新建Qt项⽬,在ui⽂件中的菜单栏中设置两个菜单:"文件"和"编辑",在菜单"文件"下新建菜单项:"创建"并将菜单项"新建"置于工具栏中;如下图示:

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


2.2 非模态对话框

非模态对话框显示后独立存在,可以同时与父窗口进行交互,是⼀种非阻塞式对话框,使用QDialog::show()函数调用。

  • ⾮模态对话框⼀般在堆上创建,这是因为如果创建在栈上时,弹出的⾮模态对话框就会⼀闪⽽过。

⾮模态对话框适用于特殊功能设置的场合,⽐如查找操作,属性设置等。 

示例:

    QDialog *dialog = new QDialog();//设置 大小dialog->resize(700,500);//设置标题dialog->setWindowTitle("this is a dialog");//关闭窗口的时候触发delete操作dialog->setAttribute(Qt::WA_DeleteOnClose);dialog->show();

【说明】

  • QDialog其实也是QWidget的子类,QWidget 的各种属性方法,在QDialog也同样适用。
  • 同时还需要设置Qt:WA_DeleteOnClose属性,⽬的是:当创建多个⾮模态对话框时(如打开了多个非模态对话框),为了避免内存泄漏要设置此属性。 

2.3 混合属性对话框

混合属性对话框同时具有模态对话框和非模态对话框的属性,对话框的生成和销毁具有非模态对话框属性,功能上具有模态对话框的属性。


使用QDialog::setModal()函数可以创建混合特性的对话框。通常,创建对话框时需要指定对话框的父组件。

示例:


 

(三)内置对话框

Qt提供了多种可复复用的对话框类型,即Qt标准对话框。Qt标准对话框全部继承于QDialog类。常用标准对话框如下:
 

消息对话框 QMessageBox

消息对话框是引用程序最常用的界面元素,消息对话框主要用于为用户提示重要消息,强制用户进行选择操作。其次QMessageBox是预定义的对话框,不需要手动创建布局和控件,非常适合用于显示简单的消息和接收用户的简单输入。

QMessageBox 提供了多种静态方法来快速显示不同类型的消息框:

  • information:显示一个信息消息框
QMessageBox::information(QWidget *parent, const QString &title, const QString &text
)

 接下来,我们简单通过代码实现一下:

    QMessageBox* MessageBox = new QMessageBox(this);MessageBox->setWindowTitle("对话框窗口标题!");MessageBox->setText("这是对话框文本");MessageBox->setIcon(QMessageBox::Information); //显示信息消息框MessageBox->setStandardButtons(QMessageBox::Ok | QMessageBox::Save |         QMessageBox::Cancel);//非模态对话框MessageBox->show();//模态对话框//弹出对话框,当对话框处于弹出状态时,代码就会在exec这里阻塞,一直到对话框关闭MessageBox->exec();//delete MessageBoxMessageBox->setAttribute(Qt::WA_DeleteOnClose);

输出展示:

 

虽然QMessageBox提供了许多预定义的选项,但你也可以自定义消息框的外观和行为。就接着上述代码,我们进行判断: 

    int res = MessageBox->exec();if(res == QMessageBox::Ok){qDebug() << "ok";}else if(res == QMessageBox::Save){qDebug() << "Save";}else if(res == QMessageBox::Cancel){qDebug() << "Cancel";}

当然,除了上述手动代码实现之外,我们还可以通过Qt中给出的静态方法进行实现。具体如下:

    int resutlt = QMessageBox::information(this,"对话框标题","对话框文本",QMessageBox::Ok |     QMessageBox::Cancel);if(resutlt == QMessageBox::Ok){qDebug() <<"ok";}else if(resutlt == QMessageBox::Cancel){qDebug() <<"cancle";}

其中可以设置的按钮的类型如下:


以下代码跟上述类似,就不在展开。

  • warning :显示一个警告消息框
QMessageBox::warning(QWidget *parent, const QString &title, const QString &text
)
  • critical :显示一个严重错误消息框
QMessageBox::critical(QWidget *parent, const QString &title, const QString &text
)
  • question :显示一个问题消息框,允许用户做出选择
QMessageBox::question(QWidget *parent, const QString &title, const QString &text, QMessageBox::StandardButtons buttons = NoButton, QMessageBox::StandardButton defaultButton = NoButton
)

颜色对话框 QColorDialog

 在Qt中,颜色对话框是通过QColorDialog 类实现的,它允许用户选择颜色。QColorDialog提供了一个标准的界面,让用户可以浏览和选择颜色。它是一个模态对话框,意味着它会阻塞其父窗口直到用户做出选择或取消对话框。

颜⾊对话框如下图示: 

 根据我们上述的理解,我们可能会在此处写出下列代码:

    QColorDialog* color = new QColorDialog();color->exec();delete  color;

但是在QColorDialog中提供了自己的方法。具体如下:

//打开颜⾊选择对话框,并返回⼀个QColor对象
QColorgetColor(const QColor &initial = Qt::white,QWidget *parent = nullptr,const QString &title = QString(),QColorDialog::ColorDialogOptions options = ColorDialogOptions()
)参数说明:
initial:设置默认颜⾊
parent:设置⽗对象
title:设置对话框标题
options:设置选项

示例如下:

     //函数的返回值就是用户选择的颜色QColor color = QColorDialog::getColor(QColor(255,0,0),this,"选择颜色");qDebug() << color;

输出展示: 

 其次,我们还可以基于用户选择设置窗口颜色:

    //可以基于用户选择的颜色,修改窗口色//方法一QString style = "background-color: rgb(" + QString::number(color.red()) + ", " +   QString::number(color.green()) + ", "+  QString::number(color.blue()) + ");";this->setStyleSheet(style);//方法二char buffer[1024] = {0};         sprintf(buffer,"backgroundcolor:rgb(%d,%d,%d);",color.red(),color.green(),color.blue());this->setStyleSheet(buffer);

 

 字体对话框 QFontDialog

在Qt中,QFontDialog类用于显示一个字体选择对话框,允许用户选择字体的样式、大小、粗细等属性。其次这个对话框是模态的,提供了一个简单而强大的方式来让用户选择字体,适用于需要字体选择功能的应用程序

示例:

    bool flag = false;QFont font = QFontDialog::getFont(&flag);//qDebug() << font;qDebug() << "ok = " << flag;qDebug() <<"字体" <<font.family();qDebug() << "获取字号" <<font.pointSize();qDebug() << "是否倾斜" <<font.italic();qDebug() << "是否加粗" << font.bold();//把对话框文件字体进行设置ui->pushButton->setFont(font);

运行效果如下:

 


输入对话框 QInputDialog

在Qt中,QInputDialog 是一个用于提供简单输入的对话框类,它允许用户输入文本、数字或选择列表中的一个选项。这个对话框是模态的,提供了快速而简单的方式来获取用户输入,适用于不需要复杂输入界面的场景

常用方法介绍:

  • 1、双精度浮点型输入数据对话框
double getDouble(QWidget *parent,const QString &title,const QString &label,double value=0,double min=-2147483647,double max=2147483647,int decimals=1,bool *ok=nullptr,Qt::WindowFlags flags=Qt::WindowFlags()
);
  • 2、整型输入数据对话框
int getInt(QWidget *parent,const QString &title,const QString &label,int value=0,int min=-2147483647,int max=2147483647,int step=1,bool* ok=nullptr,Qt::WindowFlagsflags=Qt::WindowFlags()
);

  • 3、选择条目型输入数据框
QString getItem(QWidget *parent,const QString &title,const QString &label,const QStringList &items,int current=0,bool editable=true,bool *ok=nullptr,Qt::WindowFlags flags=Qt::WindowFlags(),Qt::InputMethodHints inputMethodHints=Qt::ImhNone
);参数说明:
parent:⽗亲
title:对话框标题
label:对话框标签
items:可供选择的条⽬

示例

void MainWindow::on_pushButton_clicked()
{//打印整数int res = QInputDialog::getInt(this,"整数输入对话框","请输入一个整数:");qDebug() << res;
}void MainWindow::on_pushButton_2_clicked()
{//打印浮点数float res = QInputDialog::getDouble(this,"整数输入对话框","请输入一个浮点数:");qDebug() << res;
}void MainWindow::on_pushButton_3_clicked()
{//打印条目QStringList item;item.push_back("111");item.push_back("222");item.push_back("333");item.push_back("444");QString body = QInputDialog::getItem(this,"条目输入对话框","请输入条目",item);qDebug() << body;
}

运行效果如下:


 

文件对话框 QFiledialog

在Qt中,QFiledialog是一个用于打开和保存文件的对话框类。它提供了一个标准的界面,让用户可以浏览文件系统、选择文件或目录,并执行打开或保存操作,其次QFiledialog也模态的。

常用方法介绍:

  • 1、打开文件(⼀次只能打开⼀个文件)
QString getOpenFileName(QWidget* parent = nullptr,const QString &caption = QString(),constQString &dir = QString(),constQString &filter= QString(),QString*selectedFilter = nullptr,QFileDialog::Optionsoptions = Options()
)

示例1:打开文件

 QString file = QFileDialog::getOpenFileName(this,  //父亲"文件", //文件对话框标题"D:\\c++ Learning\\qt\\code\\Qt window\\QFileDialog\\untitled",//打开路径"*.cpp" //打开文件格式);qDebug() << file;

 运行效果如下:

  •  2、打开多个文件(⼀次可以打开多个文件)
QStringList getOpenFileNames(QWidget *parent=nullptr,const QString &caption=QString(),const QString &dir=QString(),const QString &filter=QString(),QString *selectedFilter=nullptr,QFileDialog::Optionsoptions=Options()
)
  • 3、保存文件
QString getSaveFileName(QWidget*parent=nullptr,constQString &caption=QString(),const QString &dir=QString(),const QString &filter=QString(),QString *selectedFilter=nullptr,QFileDialog::Options options=Options()
)参数说明:
参数1:parent ⽗亲
参数2:caption 对话框标题
参数3:dir 默认打开的路径
参数4:filter ⽂件过滤器

总结

在Qt中,对话框是用于与用户进行交互的特殊窗口,通常用于输入数据、显示信息或进行设置。对话框可以是模态的也可以是非模态的。

主要特点:

1.模态对话框(Modal Dialogs)

  • 阻塞父窗口,直到对话框关闭。
  • 通常用于需要用户立即响应的情况,如确认操作、输入数据等。
  • 在Qt中,可以使用Dialogs类创建模态对话框。

2.非模态对话框(Non-modal Dialogs)

  • 不阻塞父窗口,用户可以同时与父窗口和其他非模态对话框交互。
  • 适用于不需要立即响应的辅助窗口,如状态显示、日志查看等。

创建对话框:

  • 继承QDialog:创建自定义对话框时,通常需要继承QDialog类,并在其中定义所需的界面元素和逻辑。
  • 使用预定义对话框:Qt提供了一系列预定义的对话框类,如QFileDialog(文件选择)、QColorDialog(颜色选择)、QMessageBox(消息提示)等,可以直接使用这些类来实现常见的对话框功能。

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

相关文章

RK3568 驱动RTC 使用

一、简介 RK3568开发板采用HYM8563作为RTC(Real Time Clock)&#xff0c;HYM8563是一款低功耗CMOS实时时钟/日历芯片,它提供一个可编程的时钟输出,一个中断输出和一个掉电检测器,所有的地址和数据都通过I2C总线接口串行传递。最大总线速度为 400Kbits/s,每次读写数据后,内嵌的…

大数据学习|理解和对比 Apache Hive 和 Apache Iceberg

文章目录 数据模型与存储事务支持性能优化使用场景总结数据模型与存储 Hive: Hive 使用的是传统的关系型数据模型,数据存储在 Hadoop 分布式文件系统 (HDFS) 中,通常是以文本格式(如 CSV 或 TSV)或者二进制格式(如 Parquet 或 ORC)。Hive 的表定义和元数据存储在一个外部…

【C/C++】web服务器项目开发总结【请求 | 响应 | CGI】

博客主页&#xff1a;花果山~程序猿-CSDN博客 文章分栏&#xff1a;Linux_花果山~程序猿的博客-CSDN博客 关注我一起学习&#xff0c;一起进步&#xff0c;一起探索编程的无限可能吧&#xff01;让我们一起努力&#xff0c;一起成长&#xff01; 目录 一&#xff0c;背景 二&…

Python(TensorFlow)和MATLAB及Java光学像差导图

&#x1f3af;要点 几何光线和波前像差计算入瞳和出瞳及近轴光学计算波前像差特征矩阵方法计算光谱反射率、透射率和吸光度透镜像差和绘制三阶光线像差图和横向剪切干涉图分析瞳孔平面焦平面和大气湍流建模神经网络光学像差计算透镜光线传播几何偏差计算像差和像散色差纠正对齐…

2024版最新渗透测试工具大全(非常详细)零基础入门到精通,收藏这一篇就够了

所有工具仅能在取得足够合法授权的企业安全建设中使用&#xff0c;在使用所有工具过程中&#xff0c;您应确保自己所有行为符合当地的法律法规。如您在使用所有工具的过程中存在任何非法行为&#xff0c;您将自行承担所有后果&#xff0c;所有工具所有开发者和所有贡献者不承担…

统计学习方法与实战——统计学习方法概论

统计学习方法概论 文章目录 统计学习方法概论前言章节目录导读 实现统计学习方法的步骤统计学习方法三要素模型模型是什么? 策略损失函数与风险函数常用损失函数ERM与SRM 算法 模型评估与模型选择过拟合与模型选择 正则化与交叉验证泛化能力生成模型与判别模型生成方法判别方法…

打卡第60天------图论

加油&#xff01;尽管前面的道路很困难&#xff0c;但是依然要坚持下去✊。 在算法训练营我学到了很多东西&#xff0c;对于算法的方法来说真的是涨知识了&#xff0c;对于我一个非科班出身&#xff0c;半路转行的干IT的人来说真的给予了我很大的帮助。我会继续回头看代码随想录…

无人机之传感器篇

无人机的传感器系统是其实现自主飞行、导航、避障、目标识别和环境感知等功能的关键部分。以下是对无人机中常见传感器的详细解析&#xff1a; 一、主要传感器类型 GPS&#xff08;全球卫星定位系统&#xff09; 功能&#xff1a;提供无人机的位置和导航信息。 原理&#x…

Vulnhub:hacksudo search

靶机下载地址。下载完成后&#xff0c;在VirtualBox中导入虚拟机&#xff0c;系统处理器修改为2&#xff0c;网卡配置修改为桥接。 信息收集 主机发现 扫描攻击机同网段存活主机。 nmap 192.168.31.0/24 -Pn -T4 靶机ip&#xff1a;192.168.31.218 端口扫描 nmap 192.168…

HTTP协议到HTTPS的Java客户端改造

前言 由于安全原因&#xff0c;我们公司对外暴露的接口通过HTTP协议的方式在未来的某一天将被彻底关闭。 从那以后&#xff0c;外部客户在调用我公司的接口时就只能通过HTTPS协议。 本篇文章的目的就是安全的指导外部客户的客户端开发人员或者有类似需求的Java开发人员&…

【TheMisto.AI】Flux最强线稿模型实际效果测评(附安装方法)

原文链接&#xff1a;【TheMisto.AI】Flux最强线稿模型实际效果测评&#xff08;附安装方法&#xff09; (chinaz.com) 不知道有没有小伙伴去测试一下哈&#xff0c;上一篇文章用的都是官方提供的参考图&#xff0c;经常关注Flux的小伙伴也知道那些ControlNet买家秀和卖家秀基…

Express Response类深度解析:全面掌握属性与方法,提升开发效率

在Express框架中&#xff0c;Response对象是一个非常重要的组成部分。它代表了HTTP响应&#xff0c;并提供了一系列的方法和属性来操作这个响应。本文将深入全面地讲解Express的Response类&#xff0c;包括其所有属性和方法&#xff0c;并通过代码示例进行说明。 Response对象…

GPT-4 vs LLaMA3.1:核心技术架构与应用场景对比

目录 前言 一、GPT-4 的核心技术架构 1.1 Transformer 结构概述 1.2 GPT-4 的主要组成部分 1.3 GPT-4 的创新与改进 二、LLaMA3.1 的核心技术架构 2.1 模型概述 2.2 LLaMA3.1 的主要组成部分 2.3 LLaMA3.1 的创新与改进 三、GPT-4 和 LLaMA3.1 的主要差异 3.1 模型规…

python学习11:函数/方法的定义与调用

# 1&#xff09;定义和调用 # def 方法名([参数]): # 方法体 # [return 返回值]# 调用 方法名([参数]) 案例1&#xff1a;没有返回值 # 案例1&#xff1a;没有返回值 def login_info():username xxxpwd 123456print(我的信息是&#xff1a;用户名{username},密码是…

【Redis】Redis 典型应⽤ - 缓存 (cache)

Redis 典型应⽤ - 缓存 cache 什么是缓存使⽤ Redis 作为缓存缓存的更新策略1) 定期⽣成2) 实时⽣成 缓存预热, 缓存穿透, 缓存雪崩 和 缓存击穿关于缓存预热 (Cache preheating)关于缓存穿透 (Cache penetration)关于缓存雪崩 (Cache avalanche)关于缓存击穿 (Cache breakdown…

centOS如何查看并放行防火墙3306端口

在CentOS系统中&#xff0c;您可以使用firewall-cmd命令来检查防火墙规则&#xff0c;确认是否放行了3306端口。以下是步骤和示例代码&#xff1a; 首先&#xff0c;确保您的系统上安装了firewalld服务。如果未安装&#xff0c;请使用以下命令安装&#xff1a; sudo yum insta…

From Man vs Machine to Man + Machine

From Man vs. Machine to Man Machine: The Art and AI of Stock Analyses 论文阅读 文章目录 From Man vs. Machine to Man Machine: The Art and AI of Stock Analyses 论文阅读 AbstractConstruction and Performance of the AI AnalystMethodologyThe Performance of Ana…

xml转txt,适应各种图片格式,如jpg,png,jpeg,PNG,JPEG等

xml转txt&#xff0c;适应各种图片格式&#xff0c;如jpg&#xff0c;png&#xff0c;jpeg&#xff0c;PNG&#xff0c;JPEG等 import xml.etree.ElementTree as ET import os import cv2 import numpy as np import globclasses []def convert(size, box):dw 1. / (size[0]…

Ajax的$.post(),$.get(),$.ajax 方法请求都是默认异步请求

. p o s t ( ) &#xff0c; .post()&#xff0c; .post()&#xff0c;.get()&#xff0c;$.ajax 方法请求都是默认异步请求&#xff0c;所以如果要用到返回的结果&#xff0c;则要考虑异步问题&#xff0c;不然可能会变量出现未定义之类的情况。 改成同步的方法&#xff1a; …

Training language models to follow instructionswith human feedback

Abstract 将语言模型做得更大并不会自动提高它们遵循用户意图的能力。例如&#xff0c;大型语言模型可能会生成不真实、有毒或对用户不有帮助的输出。换句话说&#xff0c;这些模型并未与用户对齐&#xff08;aligned&#xff09;。本文展示了一种通过人类反馈来对齐语言模型与…