Qt 入门 4 之标准对话框

Qt 入门 4 之标准对话框

Qt提供了一些常用的对话框类型,它们全部继承自QDialog类,并增加了自己的特色功能,比如获取颜色、显示特定信息等。下面简单讲解这些对话框,可以在帮助索引中查看Standard Dialogs关键字,也可以直接索引相关类的类名。

  • 本文将以一个新的项目为主介绍不同类型的对话框,新建Qt Widgets 应用程序,双击ui文件后添加按钮并修改文字显示:
    在这里插入图片描述
    在这里插入图片描述
  1. 颜色对话框
  • 颜色对话框 QColorDialog 提供了一个可以获取指定颜色的对话框部件
  • 设计模式下点击.ui文件,选中颜色对话框按钮,右键转到槽选中clicked() 后进入函数定义并修改如下:
void MyWidget::on_pushButton_clicked()
{QColor color=QColorDialog::getColor(Qt::red,this,tr("颜色对话框"));qDebug()<<"color:"<<color;
}
  • 编译执行如下图,这里使用了 QColorDialog的静态函数getColor()来获取颜色,它的3个参数的作用分别是:设置初始颜色、指定父窗口和设置对话框标题。这里的Qt::red是Qt预定义的颜色对象,可以直接单击该字符串,然后按下F1查看其快捷帮助,或者在帮助索引中通过 Qt::GlobalColor 关键字,从而查看到所有的预定义颜色列表。**getColor()**函数返回一个 QColor类型数据。现在运行程序,然后单击“颜色对话框”按钮,如果不选择颜色,直接单击 OK,那么输出信息应该是QColor(ARGB1,1,0,0),这里的4个数值分别代表透明度(alpha)、红色(red)、绿色(green)和蓝色(blue)。它们的数值都是从0.0-1.0,有效数字为6位。对于alpha来说,1.0表示完全不透明,这是默认值,而0.0表示完全透明。对于三基色红、绿、蓝的数值,还可以使用0-255来表示,颜色对话框中就是使用这种方法。其中,0表示颜色最浅,255表示颜色最深。在0-255与0.0-1.0之间可以通过简单的数学运算来对应,其中0对应0.0,255对应1.0。
    在这里插入图片描述

  • 在颜色对话框中还可以添加对alpha的设置,就是在**getColor()**函数中再使用最后一个参数:

QColor color=QColorDialog::getColor(Qt::red,this,tr("颜色对话框"),QColorDialog::ShowAlphaChannel);
qDebug()<<"color:"<<color;
  • 前边使用了QColorDialog 类的静态函数来直接显示颜色对话框,好处是不用创建对象,但是如果想要更灵活的设置,则可以先创建对象,然后进行各项设置:
void MyWidget::on_pushButton_clicked()
{QColorDialog dialog(Qt::red,this);    //创建对象dialog.setOption(QColorDialog::ShowAlphaChannel);dialog.exec(); //以模态方式运行对话框QColor color=dialog.currentColor();qDebug()<<"color:"<<color;
}

2.文件对话框

  • 文件对话框QFileDialog类提供了一个允许用户选择文件或文件夹的对话框。继续在 mywidget.cpp中添加#include<QFileDialog>头文件,然后从设计模式转到“文件对话框”按钮的单击信号槽,并更改如下:
void MyWidget::on_pushButton_5_clicked()
{//将会打开默认盘中的后缀文件QString filename=QFileDialog::getOpenFileName(this,tr("文件对话框"),"D:",tr("图片文件(*png*jpg"));qDebug()<<"fileName:"<<filename;
}
  • 这里使用了 QFileDialog类中的**getOpenFileName()**函数来获取选择的文件名,它的4个参数的作用分别是:指定父窗口设置对话框标题、指定默认打开的目录路径和设置文件类型过滤器。这个函数会以模态方式运行一个文件对话框。打开后选择一个文件,单击“打开”按钮后,这个函数便可以返回选择的文件的文件名。如果不指定文件过滤器,则默认选择所有类型的文件。这里指定了只选择png和jpg两种格式的图片
  • 也支持同时选择其他类型的文件:
 QString filename=QFileDialog::getOpenFileName(this,tr("文件对话框"),"D:",tr("图片文件(*png*jpg);;文本文件(*txt)"));

在这里插入图片描述

  • 前边只支持选择单个文件,要同时选择多个文件,则可以使用getOpenFileNames()函数:
   QStringList filenames=QFileDialog::getOpenFileNames(this,tr("文件对话框"),"F:",tr("图片文件(*png,jpg"));
  • 运行程序就可以同时选择多个图片文件了,多个文件名存放在QStringList类型变量中。当然也可以不使用这些静态函数,而是建立对话框对象来操作。除了上面的两个函数外,QFileDialog类还提供了getSaveFileName()函数来实现保存文件对话框和文件另存为对话框,还有getExistingDirectory()函数来获取一个已存在的文件夹路径。因为它们的用法与上面的例子类似,这里就不再举例。
  1. 字体对话框
  • 字体对话框QFontDialog类提供了一个可以选择字体的对话框部件。先添加#include <QFontDialog>头文件,然后转到“字体对话框”按钮的单击信号槽,更改如下:
void MyWidget::on_pushButton_2_clicked()
{//ok用于标记是否单击了 OK 按钮bool ok;QFont font=QFontDialog::getFont(&ok,this);//如果单击OK按钮,那么让“字体对话框”按钮使用新字体//如果单击Cancel按钮,那么输出信息if(ok)ui->pushButton_2->setFont(font);elseqDebug()<<tr("没有选择字体!");
}

在这里插入图片描述

  • 这里使用了QFileDialog类的 getFont() 静态函数来获取选择的字体。这个函数的第一个参数是bool类型变量,用来存放按下的按钮状态,比如在打开的字体对话框中单击了OK按钮,那么这里的ok就为true,这样来告诉程序已经选择了字体,如下图是选择了微软雅黑 14号字体的显示结果:
    在这里插入图片描述
  1. 输入对话框
  • 输入对话框 QInputDialog类用来提供一个对话框,可以让用户输入一个单一的数值或字符串。先添加头文件#include <QInputDialog>,然后进入“输人对话框”按钮的单击信号槽,更改如下:
void MyWidget::on_pushButton_6_clicked()
{bool ok;//获取字符串QString string = QInputDialog::getText(this,tr("输入字符串对话框"),tr("请输入用户名"),QLineEdit::Normal,tr("admin"),&ok);if(ok)qDebug()<<"string:"<<string;//获取整数int value = QInputDialog::getInt(this,tr("输入整数对话框"),tr("请输入-1000到1000之间的数值"),100,-1000,1000,10,&ok);if(ok)qDebug()<<"value:"<<value;//获取浮点数double value2=QInputDialog::getDouble(this,tr("输入浮点数对话框"),tr("请输入-1000到1000之间的数值"),0.00,-1000,1000,2,&ok);if(ok)qDebug()<<"value2:"<<value2;QStringList items;items<<tr("条目1")<<tr("条目2");//获取条目QString item=QInputDialog::getItem(this,tr("输入条目对话框"),tr("请选择或输入一个条目"),items,0,true,&ok);if(ok)qDebug()<<"item:"<<item;
}
  • 分别使用不同的函数定义了输入不同类型的对话框,运行如下:
    在这里插入图片描述
  1. 消息对话框
  • 消息对话框QMessageBox类提供了一个模态的对话框来通知用户一些信息,或者向用户提出一个问题并且获取答案。先添加头文件#include,然后转到“消息对话框”按钮的单击信号槽中,添加如下代码:
void MyWidget::on_pushButton_3_clicked()
{//问题对话框int ret1 = QMessageBox::question(this,tr("问题对话框"),tr("你了解Qt吗?"),QMessageBox::Yes,QMessageBox::No);if(ret1 == QMessageBox::Yes)qDebug()<<tr("问题!");//提示对话框int ret2 = QMessageBox::information(this,tr("提示对话框"),tr("这是Qt书籍!"),QMessageBox::Ok);if(ret2 == QMessageBox::Ok)qDebug()<<tr("提示!");//警告对话框int ret3 = QMessageBox::warning(this,tr("警告对话框"),tr("不能提前结束!"),QMessageBox::Yes,QMessageBox::No);if(ret3 == QMessageBox::Abort)qDebug()<<tr("警告!");//错误对话框int ret4 = QMessageBox::critical(this,tr("严重错误对话框"),tr("发现一个严重错误!"),QMessageBox::Yes,QMessageBox::No);if(ret4 == QMessageBox::YesAll)qDebug()<<tr("错误!");//关于对话框QMessageBox::about(this,tr("关于对话框"),tr("Qt Creator 普及工作!"));
}

在这里插入图片描述

  1. 进度对话框
  • 进度对话框 QProgressDialog对一个耗时较长操作的进度提供了反馈。先添加#include <QProgressDialog>头文件,然后转到“进度对话框”按钮的单击信号槽,更改如下:
void MyWidget::on_pushButton_7_clicked()
{QProgressDialog dialog(tr("文件复制进度"),tr("取消"),0,50000,this);dialog.setWindowTitle(tr("进度对话框"));  //设置窗口标题dialog.setWindowModality(Qt::WindowModal);   //将对话框设置为模态dialog.show();for(int i=0;i<50000;i++)    //演示复制进度{dialog.setValue(i);     //设置进度条的当前值QCoreApplication::processEvents();  //避免界面冻结//QThread::sleep(1);if(dialog.wasCanceled())break;}dialog.setValue(50000);    //这样才显示100%,因为for循环中少加了一个数qDebug()<<tr("复制结束!");
}

在这里插入图片描述

  1. 错误信息对话框
  • 错误信息对话框QErrorMessage类提供了一个显示错误信息的对话框。首先打开mywidget.h文件添加类前置声明:
class QErrorMessage;
  • 然后添加私有对象:
ErrorMessage *errordlg;
  • 下面到mywidget.cpp添加头文件#include <QErrorMessage>,并在构造函数中添加如下代码:
errordlg=newQErrorMessage(this);
  • 然后从设计模式转到“错误信息对话框”按钮的单击信号槽添加代码
void Mywidget::on pushButton 7 clicked()
{errordlg->setwindowTitle(tr("错误信息对话框"));errordlg->showMessage(tr("这里是出错信息!));
}
  • 运行如下:
    在这里插入图片描述
  1. 向导对话框
  • 向导对话框QWizard类提供了一个设计向导界面的框架。对于向导对话框,读者应该已经很熟悉了,比如安装软件时的向导和创建项目时的向导。QWizard之所以被称为框架,是因为它具有设计一个向导全部的功能函数,可以使用它来实现想要的效果。Qt中包含了 Trivial Wizard、License Wizard和Class Wizard这3个示例程序,可以参考一下。
  • 打开 mywidget.h文件,然后添加头文件#include <QWizard>,在MyWidget 类的声明中添加private类型函数声明:
  QWizardPage* createPage1();QWizardPage* createPage2();QWizardPage* createPage3();
  • 这里声明了3个返回值为QWizardPage类对象的指针函数,用来生成3个向导页面。然后在mywidget.cpp文件中对这3个函数进行定义:
QWizardPage* MyWidget::createPage1()
{QWizardPage* page=new QWizardPage;page->setTitle(tr("介绍"));return page;
}
QWizardPage* MyWidget::createPage2()
{QWizardPage* page=new QWizardPage;page->setTitle(tr("用户选择信息"));return page;
}
QWizardPage* MyWidget::createPage3()
{QWizardPage* page=new QWizardPage;page->setTitle(tr("结束"));return page;
}
  • 在各个函数中分别新建了向导页面,并且设置了它们的标题。下面转到“向导对话框”按钮的单击信号槽中,更改如下:
void MyWidget::on_pushButton_8_clicked()
{QWizard wizard(this);wizard.setWindowTitle(tr("向导对话框"));wizard.addPage(createPage1());   //添加向导对话框wizard.addPage(createPage2());wizard.addPage(createPage3());wizard.exec();
}
  • 运行如下:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/77232.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

买不起了,iPhone 或涨价 40% ?

周知的原因&#xff0c;新关税对 iPhone 的打击&#xff0c;可以说非常严重。 根据 Rosenblatt Securities分析师的预测&#xff0c;若苹果完全把成本转移给消费者。 iPhone 16 标配版的价格&#xff0c;可能上涨43%。 iPhone 16 标配的价格是799美元&#xff0c;上涨43%&am…

软件需求分析习题汇编

需求工程练习题 一、选择题 1. 软件需求规格说明书的内容不应包括对&#xff08; &#xff09;的描述。 A. 主要功能B. 算法的详细过程C. 用户界面及运行环境D. 软件的性能 *正确答案:*B:算法的详细过程; 2. 需求分析最终结果是产生&#xff08; &#xff09; A. 项目开发…

clickhouse注入手法总结

clickhouse 遇到一题clickhouse注入相关的&#xff0c;没有见过&#xff0c;于是来学习clickhouse的使用&#xff0c;并总结相关注入手法。 环境搭建 直接在docker运行 docker pull clickhouse/clickhouse-server docker run -d --name some-clickhouse-server --ulimit n…

智能语音识别工具开发手记

智能语音识别工具开发手记 序言&#xff1a;听见数字化的声音 在县级融媒体中心的日常工作中&#xff0c;我们每天需要处理大量音频素材——从田间地头的采访录音到演播室的节目原声&#xff0c;从紧急会议记录到专题报道素材。二十多年前&#xff0c;笔者刚入职时&#xff0…

TDengine 3.3.6.0 版本中非常实用的 Cols 函数

简介 在刚刚发布的 TDengine 3.3.6.0 版本 中&#xff0c;新增了一个非常实用的 函数COLS &#xff0c;此函数用于获取选择函数所在行列信息&#xff0c;主要应用在生成报表数据&#xff0c;每行需要出现多个选择函数结果&#xff0c;如统计每天最大及最小电压&#xff0c;并报…

【AI学习】AI Agent(人工智能体)

1&#xff0c;AI agent 1&#xff09;定义 是一种能够感知环境、基于所感知到的信息进行推理和决策&#xff0c;并通过执行相应动作来影响环境、进而实现特定目标的智能实体。 它整合了多种人工智能技术&#xff0c;具备自主学习、自主行动以及与外界交互的能力&#xff0c;旨…

【MCP】VSCode Cline配置MongoDB连接

VSCode MCP插件配置MongoDB连接教程 前言 本文将介绍如何在VSCode中配置Cline插件连接MongoDB。 环境准备 VSCodeNode.jsMongoDB服务器Cline插件 配置步骤 1. 安装MCP插件 在VSCode扩展商店中搜索"Cline"并安装。 安装完之后需要配置API平台以及设置API-KEY。…

this指针 和 类的继承

一、this指针 Human类的属性fishc与Human&#xff08;&#xff09;构造器的参数fishc同名&#xff0c;但却是两个东西。使用this指针让构造器知道哪个是参数&#xff0c;哪个是属性。 this指针&#xff1a;指向当前的类生成的对象 this -> fishc fishc当前对象&#xff08;…

使用PyTorch训练VGG11模型:Fashion-MNIST图像分类实战

本文将通过代码实战&#xff0c;详细讲解如何使用 PyTorch 和 VGG11 模型在 Fashion-MNIST 数据集上进行图像分类任务。代码包含数据预处理、模型定义、训练与评估全流程&#xff0c;并附上训练结果的可视化图表。所有代码可直接复现&#xff0c;适合深度学习初学者和进阶开发者…

汽车BMS技术分享及其HIL测试方案

一、BMS技术简介 在全球碳中和目标的战略驱动下&#xff0c;新能源汽车产业正以指数级速度重塑交通出行格局。动力电池作为电动汽车的"心脏"&#xff0c;其性能与安全性不仅直接决定了车辆的续航里程、使用寿命等关键指标&#xff0c;更深刻影响着消费者对电动汽车的…

打造船岸“5G+AI”智能慧眼 智驱力赋能客船数智管理

项目介绍 船舶在航行、作业过程中有着严格的规范要求&#xff0c;但在实际航行与作业中往往会因为人为的疏忽&#xff0c;发生事故&#xff0c;导致人员重大伤亡和财产损失&#xff1b; 为推动安全治理模式向事前预防转型&#xff0c;实现不安全状态和行为智能预警&#xff0c…

C#二叉树

C#二叉树 二叉树是一种常见的数据结构&#xff0c;它是由节点组成的一种树形结构&#xff0c;其中每个节点最多有两个子节点。二叉树的一个节点通常包含三部分&#xff1a;存储数据的变量、指向左子节点的指针和指向右子节点的指针。二叉树可以用于多种算法和操作&#xff0c;…

WinForm真入门(11)——ComboBox控件详解

WinForm中 ComboBox 控件详解‌ ComboBox 是 WinForms 中一个集文本框与下拉列表于一体的控件&#xff0c;支持用户从预定义选项中选择或直接输入内容。以下从核心属性、事件、使用场景到高级技巧的全面解析&#xff1a; 一、ComboBox 核心属性‌ 属性说明示例‌Items‌下拉…

超详细解读:数据库MVCC机制

之前文章&#xff1a;Mysql锁_exclusivelock for update写锁-CSDN博客 中有提到通过MVCC来实现快照读&#xff0c;从而解决幻读问题&#xff0c;这里详细介绍下MVCC。 一、前言 表1&#xff1a;实例表t idk1122 表2&#xff1a;事务A、B、C的执行流程 事务A事务B事务Cstart …

【SpringCloud】从入门到精通【上】

今天主播我把黑马新版微服务课程MQ高级之前的内容都看完了&#xff0c;虽然在看视频的时候也记了笔记&#xff0c;但是看完之后还是忘得差不多了&#xff0c;所以打算写一篇博客再温习一下内容。 课程坐标:黑马程序员SpringCloud微服务开发与实战 微服务 认识单体架构 单体架…

力扣hot100_回溯(2)_python版本

一、39. 组合总和&#xff08;中等&#xff09; 代码&#xff1a; class Solution:def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:ans []path []def dfs(i: int, left: int) -> None:if left 0:# 找到一个合法组合ans.append(pa…

AI平台如何实现推理?数算岛是一个开源的AI平台(主要用于管理和调度分布式AI训练和推理任务。)

数算岛是一个开源的AI平台&#xff0c;主要用于管理和调度分布式AI训练和推理任务。它基于Kubernetes构建&#xff0c;支持多种深度学习框架&#xff08;如TensorFlow、PyTorch等&#xff09;。以下是数算岛实现模型推理的核心原理、架构及具体实现步骤&#xff1a; 一、数算岛…

cesium项目之cesiumlab地形数据加载

之前的文章我们有提到&#xff0c;使用cesiumlab加载地形出现了一些错误&#xff0c;没有解决&#xff0c;今天作者终于找到了解决方法&#xff0c;下面描述一下具体步骤&#xff0c;首先在地理数据云下载dem数据&#xff0c;在cesiumlab中使用地形切片&#xff0c;得到terrain…

[Vue]App.vue讲解

页面中可以看见的内容不再在index.html中进行编辑&#xff0c;而是在App.vue中进行编辑。 组件化开发 在传统的html开发中&#xff0c;一个页面的资源往往都写在同一个html文件中。这种模式在开发小规模、样式简单的项目时会相当便捷&#xff0c;但当项目规模越来越大&#xf…

sql-labs靶场 less-1

文章目录 sqli-labs靶场less 1 联合注入 sqli-labs靶场 每道题都从以下模板讲解&#xff0c;并且每个步骤都有图片&#xff0c;清晰明了&#xff0c;便于复盘。 sql注入的基本步骤 注入点注入类型 字符型&#xff1a;判断闭合方式 &#xff08;‘、"、’、“”&#xf…