Qt 入门 3 之对话框 QDialog

Qt 入门 3 之对话框 QDialog

本文从以下几点分开讲述:
- 对话框的基本原理介绍
- 两种不同类型的对话框
- 一个由多个窗口组成并且窗口间可以相互切换的程序

1.模态和非模态对话框

  • QDialog 类是所有对话框窗口类的基类。对话框窗口是一个经常用来完成短小任务或者和用户进行简单交互的顶层窗口
  • 按照运行对话框时是否还可以和该程序的其他窗口进行交互,对话框常被分为两类:模态的(model) 和非模态的(modeless)。
  • 新建Qt Qwidgets应用项目,名称为mydialog1,然后项目中命名如下图,找到
mywidget.cpp文件添加一下代码:
#include "mywidget.h"
#include "ui_mywidget.h"
#include"qdialog.h"MyWidget::MyWidget(QWidget *parent): QWidget(parent), ui(new Ui::MyWidget)
{ui->setupUi(this);QDialog dialog(this);dialog.show();
}

在这里插入图片描述

  • 在 MyWidget 类的构造函数中定义了一个QDialog类对象,还指定了 dialog的父窗口为 MyWidget 类对象(即this参数的作用),最后调用show()函数让其显示。运行程序时就发现,一个窗口一闪而过,然后就只显示MyWidget窗口了,为什么会这样呢?因为对于一个函数中定义的变量,等这个函数执行结束后,它就会自动释放。也就是说,这里的 dialog对象只在这个构造函数中有用,等这个构造函数执行完了,dialog也就消失了。为了不让dialog消失,可以将QDialog对象的创建代码更改如下:
    QDialog* dialog = new QDialog(this);dialog->setWindowTitle(QObject::tr("dialog1"));dialog->show();
  • 可以正常显示了。需要说明的是,我们说定义一个对象是指“QDialog dialog;”这样的方式,而像“QDialog *dialog;“这样不能被称为定义了一个对象,而应该说成定义了一个指向QDialog类对象的指针变量。后面也会把“QDialog *dialog;"说成是定义了一个QDialog对象。再补充一点,这里为对话框对象指明了父窗口,所以就没有必要使用delete来释放该对象了
    在这里插入图片描述
    其实不用指针也可让对话框显示出来,可以将代码修改如下:
    QDialog dialog(this);dialog.exec();
  • 这时运行程序就会发现对话框弹出来了,但是MyWidget(MyWidget)窗口并没有出来,当关闭对话框后,MyWidget窗口才弹出来。这个对话框与前面那个对话框的效果不同,称它为模态对话框,而前面那种对话框称为非模态对话框。
  • 模态对话框就是在没有关闭它之前,不能再与同一个应用程序的其他窗口进行交互,比如新建项目时弹出的对话框。而对于非模态对话框,既可以与它交互,也可以与同一程序中的其他窗口交互,如Microsoft Word中的查找替换对话框。就像前面看到的,要想使一个对话框成为模态对话框,则只需要调用它的exec()函数;而要使其成为非模态对话框,则可以使用new操作来创建,然后使用show()函数来显示。其实使用show()函数也可以建立模态对话框,只须在其前面使用setModal()函数即可。例如:
QDialog * dialog = new QDialog(this);
dialog->setModal(true);
dialog->show();  
  • 运行程序后可以看到,生成的对话框是模态的。但是,它与用exec()函数时的效果是不一样的,因为现在的MyWidget窗口也显示出来了。这是因为调用完show()函数后会立即将控制权交给调用者,程序可以继续往下执行。而调用exec()数却不同,只有当对话框被关闭时才会返回。与setModal()函数相似的还有一个setWindowModality()函数,它有一个参数来设置模态对话框要阻塞的窗口类型,可以是Qt::NonModal(不阻塞任何窗口,就是非模态)、Qt::WindowModal(阻塞它的父窗口、所有祖先窗口以及它们的子窗口)或Qt::ApplicationModal(阻塞整个应用程序的所有窗口)。而setModal()函数默认设置的是Qt::ApplicationModal。

2.多窗口切换

2.1 认识信号与槽

  • Qt中使用信号与槽机制来完成对象之间的协同操作
  • 简单来说,信号和槽都是函数,比如单击窗口上的一个按钮后想要弹出一个对话框,那么可以将这个按钮的单击信号和自定义相关的槽关联起来,在这个槽中创建一个对话框来显示它
  • 举个例子,在之前的项目中做出如下更改:
    • 在mywidget.h中加入槽函数 定义:
public:void showChildDialog();
- 在mywidget.cpp中添加槽函数定义
void MyWidget::showchildDialog()
{QDialog* dialog = new QDialog(this);dialog->show();
}
- 在mywidget.cpp 基类构造函数中添加connect函数:
connect(ui->showchildButton,&OPushButton::clicked,this, &MyWidget::showchildDialog);
  • 然后点击mywidget.ui做出如下界面编辑操作:新拉一个pushputton并更改按钮名和显示文本,新拉一个label并更改显示本文
    在这里插入图片描述

  • 上述更改主要想实现以下功能:点击 按钮 则显示新的子窗口
    在这里插入图片描述

  • connect函数详解,其时QObject类中的函数,因为QWidget继承自QObject,因此可以直接使用

  • 函数4个参数分别对应:发射信号的对象、发射的信号、接收信号的对象、要执行的槽

  • 上述信号与槽的连接成为手动关联,还有一种是自动关联,比如前边的槽函数可以重命名为 on_showChildButton_clicked(),就是由字符on 、发射信号的部件对象名和信号名组成

2.2 自定义对话框

  • 依然在前边的项目中更改:

  • 第一步,添加自定义对话类框。依然在前面的项目中更改。首先向该项目中添加Qt设计师界面类。界面模板选择DialogwithoutButtons,类名改为MyDialog。然后在设计模式中向窗口添加两个PushButton,并且分别更改其显示文本为“进人主界面”和“退出程序”
    在这里插入图片描述

  • 第二步,设计信号与槽。这里使用设计器来实现”退出程序" 按钮的信号和槽的关联。单击设计器上方的Edit Signals/Slots图标,或者按下快捷键F4,于是进入了部件的信号和槽的编辑模式。在“退出程序”按钮上按住鼠标左键,然后拖动到窗口界面上,这时松开鼠标左键。在弹出的配置连接对话框中选择“显示从QWidget继承的信号和槽”选项,然后在左边的QPushButton栏中选择信号clicked(),在右边的 QDialog栏中选择对应的槽close(),完成后单击OK按钮

  • 如图下图所示(这里还可以单击“编辑”按钮添加自定义的槽,不过这还需要在MyDialog类中实现该槽)。这时“退出程序”按钮的单击信号就和对话框中的关闭操作槽进行了关联。要想取消这个关联,只须在信号和槽编辑模式中选择这个关联;当它变为红色时,按下Delete键,或者右击选择“删除”。也可以在设计器下方的信号和槽编辑器中看到设置好的关联。当然,直接在信号和槽编辑器中建立关联也是可以的,它与鼠标选择部件进行关联是等效的。设置好关联后按下F3键,或者单击“编辑控件”图标,则回到部件编辑模式。
    在这里插入图片描述

  • 现在设置“进人主界面”按钮的信号和槽的关联。在该按钮上右击,在弹出的级联菜单中选择“转到槽”,然后在弹出的对话框中选择clicked()信号,并单击OK按钮。这时便会进人代码编辑模式,并且定位到自动生成的on_pushButton_clicked()槽中在其中添加代码:
    在这里插入图片描述

void MyDialog::on_pushButton_clicked()
{accept();
}
  • 这个 accept()函数是 QDialog类中的一个槽,对于一个使用exec()函数实现的模态对话框,执行了这个槽就会隐藏这个模态对话框,并返回QDialog::Accepted值,这里就是要使用这个值来判断是哪个按钮被按下了。与其对应的还有一个**reject()**槽,它可以返回一个 QDialog::Rejected值,前面的“退出程序”按钮也可以关联这个槽。
  • 在主界面中使用自定义的对话框,更改 main 函数如下:
#include "mywidget.h"
#include"mydialog.h"
#include <QApplication>
int main(int argc, char *argv[])
{QApplication a(argc, argv);MyWidget w;//w.show();//return a.exec;MyDialog dialog;if(dialog.exec()==QDialog::Accepted){w.show();return a.exec();}else{return 0 ;}
}
  • 运行程序后可以发现,已经实现了从录对话框到主界面,再从主界面显示一个对话框的应用了。执行后效果如下:

1744004049407

  • 再来实现可以从主界面重新进入登录界面的功能。双击mywidget.ui文件,在设计模式中再向界面添加两个PushButton,分别更改它们的显示文本为“重新登录”和“退出”。然后使用信号和槽模式将“退出”按钮的clicked()信号和MyWidget 界面的**close()槽关联。完成后再转到“重新登录”按钮的clicked()**信号的槽,并更改如下:

在这里插入图片描述

void MyWidget::on_pushButton _clicked()
{//先关闭界面,其实是隐藏了,并没有真正退出,然年新建MyDialog对象close();MyDialog dlg;//如果按下了[重新登录]按钮,则再次显示主界面if(dlg.exec()==QDialog::Accepted)show();
}

运行后效果如下:

1744004593360

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

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

相关文章

数据结构——哈希技术及链地址法

目录 一、哈希的定义 二、哈希冲突定义 三、构造哈希函数的方法 四、四种解决哈希冲突的方法 4.1 开放地址法 4.2 链地址法 4.3 再散列函数法 4.4 公共区溢出法 五、链地址法结构体设计 六、基本操作的实现 6.1 哈希函数 6.2 初始化 6.3 插入值 6.4 删除值 6.5 查…

算法思想之前缀和(二)

欢迎拜访&#xff1a;雾里看山-CSDN博客 本篇主题&#xff1a;算法思想之前缀和(二) 发布时间&#xff1a;2025.4.11 隶属专栏&#xff1a;算法 目录 滑动窗口算法介绍核心思想大致步骤 例题和为 K 的子数组题目链接题目描述算法思路代码实现 和可被 K 整除的子数组题目链接题目…

开源的7B参数OCR视觉大模型:RolmOCR

1. 背景介绍 早些时候&#xff0c;Allen Institute for AI 发布了 olmOCR&#xff0c;这是一个基于 Qwen2-VL-7B 视觉语言模型&#xff08;VLM&#xff09;的开源工具&#xff0c;用于处理 PDF 和其他复杂文档的 OCR&#xff08;光学字符识别&#xff09;。开发团队对该工具的…

移动端六大语言速记:第14部分 - 数据库操作

移动端六大语言速记:第14部分 - 数据库操作 本文将对比Java、Kotlin、Flutter(Dart)、Python、ArkTS和Swift这六种移动端开发语言在数据库操作方面的特性,帮助开发者理解和掌握各语言的数据库编程能力。 14. 数据库操作 14.1 SQL查询 各语言SQL查询实现方式对比: 特性Ja…

有哪些反爬机制可能会影响Python爬取视频?如何应对这些机制?

文章目录 前言常见反爬机制及影响1. IP 封禁2. 验证码3. 请求头验证4. 动态加载5. 加密与混淆6. 行为分析 应对方法1. 应对 IP 封禁2. 应对验证码3. 应对请求头验证4. 应对动态加载5. 应对加密与混淆6. 应对行为分析 前言 在使用 Python 爬取视频时&#xff0c;会遇到多种反爬…

ESP32开发入门:基于VSCode+PlatformIO环境搭建指南

前言 ESP32作为一款功能强大的物联网开发芯片&#xff0c;结合PlatformIO这一现代化嵌入式开发平台&#xff0c;可以大幅提升开发效率。本文将详细介绍如何在VSCode中搭建ESP32开发环境&#xff0c;并分享实用开发技巧。 一、环境安装&#xff08;Windows/macOS/Linux&#xf…

DeepSeek:穿透行业知识壁垒的搜索引擎攻防战

DeepSeek&#xff1a;穿透行业知识壁垒的搜索引擎攻防战 文 / 产业智能观察组&#xff08;人机协同创作&#xff09; 一、搜索引擎的"认知折叠"危机 2024年Q1数据显示&#xff0c;百度搜索结果前10页中&#xff0c;61.7%的内容存在"伪专业化"现象——看似…

SQL 外键(Foreign Key)详细讲解

1. 什么是外键&#xff1f;​​ ​​定义​​&#xff1a;外键是数据库表中的一列&#xff08;或一组列&#xff09;&#xff0c;用于​​建立两个表之间的关联关系​​。外键的值必须匹配另一个表的主键&#xff08;Primary Key&#xff09;或唯一约束&#xff08;Unique Con…

5G中的DU和CU的作用

在5G网络架构中&#xff0c;CU&#xff08;Centralized Unit&#xff0c;集中单元&#xff09; 和 DU&#xff08;Distributed Unit&#xff0c;分布单元&#xff09; 是无线接入网&#xff08;RAN&#xff09;的重要组成部分&#xff0c;它们的分工和作用如下&#xff1a; 1.…

深度解析 n8n:强大的开源工作流自动化平台

在数字化时代&#xff0c;企业和个人面临着日益复杂的工作流程和多样化的应用工具&#xff0c;如何高效整合这些资源、实现工作流的自动化成为提升效率的关键。n8n 作为一款开源的工作流自动化平台&#xff0c;凭借其强大的功能、广泛的应用集成能力和灵活的部署方式&#xff0…

ruby超高级语法

以下是 Ruby 中一些 极度硬核 的语法和底层特性&#xff0c;涉及元编程的深渊、虚拟机原理、语法黑魔法等&#xff0c;适用于追求极限的 Ruby 开发者&#xff1a; 高级语法一 一、语法核弹级操作 1. 动态修改继承链 class A; def foo; "A"; end end class B; def …

flutter 获取通话记录和通讯录

Dart SDK version is 3.7.01 dependencies:flutter:sdk: flutterpermission_handler: ^11.0.1 # 权限管理flutter_contacts: ^1.1.92call_log: ^5.0.5cupertino_icons: ^1.0.8dev_dependencies:flutter_test:sdk: flutterflutter_lints: ^5.0.0 2 contact_and_calls_page.da…

bash脚本手动清空mysql表数据

文章目录 1、bash脚本手动清空mysql表数据 1、bash脚本手动清空mysql表数据 #!/bin/bash# 配置区域&#xff08;修改此处&#xff09; MYSQL_USER"root" MYSQL_PASSWORD"123456" MYSQL_HOST"localhost" DATABASES("hps-base:base_test_ite…

Spark Core编程

一文读懂Spark Core编程核心要点 最近在学习大数据处理框架Spark&#xff0c;今天来给大家分享一下Spark Core编程中非常重要的内容&#xff0c;包括RDD算子、累加器和广播变量&#xff0c;希望能帮助大家更好地理解和掌握Spark编程。先来说说RDD算子&#xff0c;它是Spark编程…

SDP(一)

SDP(Session Description Protocol)会话描述协议相关参数 Session Description Protocol Version (v): 0 --说明&#xff1a;SDP当前版本号 Owner/Creator, Session Id (o): - 20045 20045 IN IP4 192.168.0.0 --说明&#xff1a;发起者/创建者 会话ID&#xff0c;那么该I…

HarmonyOS:组件布局保存至相册

一&#xff0c;需求背景 有这样一个需求&#xff0c;将页面上的某个自定义组件以图片的形式保存至相册。 二&#xff0c;需求拆解 根据需求分析&#xff0c;可将需求拆解成两步&#xff1a; 1&#xff0c;将组件转换成图片资源&#xff1b; 2&#xff0c;将图片保存到相册…

算法中的数论基础

算法中的数论基础 本篇文章适用于算法考试或比赛之前的临场复习记忆&#xff0c;没有复杂公式推理&#xff0c;基本上是知识点以及函数模版&#xff0c;涵盖取模操作、位运算的小技巧、组合数、概率期望、进制转换、最大公约数、最小公倍数、唯一分解定理、素数、快速幂等知识…

Redis下载稳定版本5.0.4

https://www.redis.net.cn/download/ Redis下载 Redis 版本号采用标准惯例:主版本号.副版本号.补丁级别,一个副版本号就标记为一个标准发行版本,例如 1.2,2.0,2.2,2.4,2.6,2.8,奇数的副版本号用来表示非标准版本,例如2.9.x发行版本是Redis 3.0标准版本的非标准发行版本…

‌UniApp 安卓打包完整步骤(小白向)

‌ ‌一、环境准备‌ ‌安装 HBuilderX‌ 下载最新版 HBuilderX 并安装&#xff08;官方 IDE&#xff0c;支持一键打包&#xff09;‌16确保已安装 Node.js&#xff08;用于依赖管理&#xff09;‌26 ‌配置 Android 开发环境‌ 安装 ‌Java JDK 17‌&#xff08;建议选择稳定…

【Springboot知识】Springboot配置加载机制深入解读

文章目录 配置加载概述**Spring Boot 配置加载机制详解****一、配置加载顺序&#xff08;优先级由低到高&#xff09;****二、关键配置机制说明****1. Profile 机制****2. 外部化配置****3. 配置属性绑定到 Bean****4. 动态覆盖配置** **三、配置加载流程图****2. 配置导入&…