【快速上手QT】07-对话框QDialog

QDialog

今天讲一个我们这个系列的第一篇就提到的东西:QDialog。

相信经过前几篇的学习,大家应该是能够通过QT助手来对QDialog有个初步的了解。

我们就直接来测试一下。

#include "Zhetu.h"#include <qdebug.h>
#include <QPushButton>
#include <QDialog>Zhetu::Zhetu(QWidget *parent): QMainWindow(parent){this->setFixedSize(650, 400);QPushButton* button = new QPushButton("test", this);button->move(100, 100);connect(button, &QPushButton::clicked, [&]() {QDialog* d = new QDialog();d->show();});
}Zhetu::~Zhetu()
{}

就是我们先设置一个按钮,这个按钮按下,我们就生成一个QDialog。

我们先记着这个写法,在new这个QDialog的时候,它的构造函数里我们是空着的,也就是没有给它指定父亲,效果如上图。当QDialog出现的时候,实际上是多开了个窗口。

如果我们给它指定父亲为主界面的时候,效果如下图,没有多开一个窗口,这个是两种写法比较显著的区别。

然后我们发现,按一次按钮会生成一个QDialog,而我们可以一直按,如果我们只让它生成一个,那该怎么实现呢,我们从软件层面入手的话就可以在外面设置一个变量,用这个变量来控制只能生成一个。我们也可以从这个组件本身入手。

我们上面代码用的是show函数来让它显示出来,我们也有其他方法,例如上面的exec。

 使用exec来代替show之后,我们发现,一旦QDialog出现之后,我们就只能操作QDialog了,如果我们点击了主界面的话,则会发出提示音并且QDialog闪动,这就是在告诉我们,我们此时只能操作QDialog,直到我们关闭QDialog之后才恢复正常。

QDialog相关的事件函数也很多,这边就演示一下第一个closeEvent,其他的函数通过名字相信大家也能猜出是干什么的。

#include "Zhetu.h"#include <qdebug.h>
#include <QPushButton>
#include <QDialog>void QDialog::closeEvent(QCloseEvent* e) {qDebug() << "Bye world";
}Zhetu::Zhetu(QWidget *parent): QMainWindow(parent){this->setFixedSize(650, 400);QPushButton* button = new QPushButton("test", this);button->move(100, 100);connect(button, &QPushButton::clicked, [&]() {QDialog* d = new QDialog(this);d->exec();});
}Zhetu::~Zhetu()
{}

消息对话框

那么关于QDialog的内容就讲这么多,接下来我们讲别的。

可以看到继承QDialog的组件有不少,我们讲一下QMessageBox,其他的相信大家经过这篇文章的学习之后也能通过QT助手看懂。

而QMessgaeBox中,我们主要讲一下它的静态函数。

我们从第三个开始看,从第三个开始的函数的返回值类型变得很长。

可以看得出来是枚举类型,也可以看的出来这些函数的返回值是int类型的。

我们从第一个开始测试。

#include "Zhetu.h"#include <qdebug.h>
#include <QPushButton>
#include <QDialog>
#include <QMessageBox> Zhetu::Zhetu(QWidget *parent): QMainWindow(parent){this->setFixedSize(650, 400);QPushButton* button = new QPushButton("test", this);button->move(100, 100);connect(button, &QPushButton::clicked, [&]() {int res = QMessageBox::critical(this, "title", "text");qDebug() << res;});
}Zhetu::~Zhetu()
{}

看的出来这会弹出一个警告的提示框,我们点击默认提供的按钮“OK”之后返回值为1024,这也符合上面图片中的0x0400。

我上面测试代码中给构造函数传了三个参数,第一个是this,也就是指定它的父亲为主界面,第二个字符串设置提示框的标题,第三个字符串设置提示框里的内容。

但是实际上它的构造函数中可以有五个参数,我们再一个个试试。

看不懂英文的话我们就简单翻译一下。 

 我们再多加一个参数试一下。

根据QT助手提供的构造函数中的参数类型,我们先随便塞一个Close进去,可以发现,原本“OK”的按键变成了“Close”,也就是说我们可以更改提示框中的按键的内容,但是不是随意更改的,因为传参的类型需要为QMessageBox::StandarButtons类型。

我们再传入第五个参数试试。

发现按钮多了一个,并且排在前面的是第五个参数,当我们按下回车的时候,默认选择的也是第五个参数。

因此我们稍微总结一下,提示框可以有两个按钮(但是默认是一个,另一个我们是需要传入参数指定的),按下不同按钮的时候,提示框会关闭,并且根据我们按下的按钮返回不同的数值,我们可以根据不同数值去执行不同的逻辑。

其实剩下其他函数也差不多,只是提示框的类型不一样,那么下面就简单地演示一下,详细的内容都可以像上面那样通过查询QT助手去搞懂。

当然了,以上的静态函数是很方便我们使用的,因为不需要自己去new一个类出来,但是缺点也很明显,那就是提供我们修改的空间不大,并且也无法重载事件函数,虽然基本上够我们使用,但是有些情况下我们还需要自己DIY的,那么我们就需要new一个QMessageBox出来了。

我们构造一个出来QMessageBox出来,默认就有一个“OK”按钮,我们使用exec让它显示出来,也会有个返回值回来。

那么我们应该如何DIY呢,我们再看看QMessageBox的函数,找到set开头的。

相信大家都能看得懂,我就不一个个介绍了,下面我就总体的展示一下作为这篇文章的结尾。

#include "Zhetu.h"#include <qdebug.h>
#include <QPushButton>
#include <QDialog>
#include <QMessageBox> Zhetu::Zhetu(QWidget *parent): QMainWindow(parent){this->setFixedSize(650, 400);QPushButton* button = new QPushButton("test", this);button->move(100, 100);connect(button, &QPushButton::clicked, [&]() {QMessageBox* m = new QMessageBox(this);m->setWindowTitle("title");m->setText("text");m->setIcon(QMessageBox::Critical);m->setStandardButtons(QMessageBox::Yes);	//设置一开始就有的按钮内容m->addButton(QMessageBox::Cancel);			//添加一个按钮m->addButton(QMessageBox::Save);m->setDefaultButton(QMessageBox::Yes);		//设置默认按钮(需要先有)int res = m->exec();qDebug() << res;});
}Zhetu::~Zhetu()
{}

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

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

相关文章

IntelliJ IDEA插件php golang python shell docker ignore UML plantuml等插件安装

IntelliJ IDEA插件php golang python shell docker ignore UML plantuml等插件安装 有的插件,需要代理才能搜索和下载 设置代理 不然插件搜索不到&#xff0c;也可能下载不了 Preferences -->Plugins --> Browse repositorise… --〉HTTP Proxy Settings… 选择 Manual…

Linux笔记--静态库和动态库

库是指在我们的应用中&#xff0c;有一些公共代码是需要反复使用&#xff0c;就把这些代码编译为"库"文件;在链接步骤中&#xff0c;链接器将从库文件取得所需的代码&#xff0c;复制到生成的可执行文件中。 Linux中常见的库文件有两种&#xff0c;一种.a为后缀&…

这回就好好聊聊Kotlin的泛型

公众号「稀有猿诉」 原文链接 这回就好好聊聊Kotlin的泛型 泛型(Generics)是静态强类型编程语言中非常强大的特性&#xff0c;可以极大的加强代码的复用&#xff0c;并增强类型安全&#xff0c;减少运行时的类型转换错误。在这篇文章就来详细的学习一下Kotlin中对泛型的…

EasyX的学习2

消息处理——漂亮的按钮(鼠标) 用到的函数 1.消息结构体变量类型&#xff1a;使用ExMessage ExMessage msg{ 0 }; 定义一个变量名为msg的ExMessage结构体变量并初始化为0 2.获取消息函数&#xff1a;peekmessage函数 //获取消息 peekmessage(&msg, EX_MOUSE); 两个参…

Batch Normalization和Layer Normalization和Group normalization

文章目录 前言一、Group normalization二、批量规范化(Batch Normalization)三、层规范化&#xff08;Layer Normalization&#xff09; 前言 批量规范化和层规范化在神经网络中的每个批次或每个层上进行规范化&#xff0c;而GroupNorm将特征分成多个组&#xff0c;并在每个组内…

表格制作一对多,多对多

<!-- <tr><td>第1行第1列</td><td>第1行第2列</td></tr><tr><td rowspan"4">第2行第1列</td><td colspan"2">第2行第2列</td><td colspan"3">第2行第2列</td>…

STM32CubeMX学习笔记8 -ADC

1. ADC简介 ADC 是Analog-to-Digital Converter的缩写。指模/数转换器或者模拟/数字转换器。是指将连续变量的模拟信号转换为离散的数字信号的器件。典型的模拟数字转换器将模拟信号转换为表示一定比例电压值的数字信号。简单地说就是将模拟电压值&#xff0c;转换成对应的肉眼…

力扣--动态规划152.乘积最大子数组

思路分析&#xff1a; 使用动态规划&#xff0c;定义一个二维数组dp&#xff0c;其中dp[i][0]表示以第i个元素结尾的乘积最大子数组的乘积&#xff0c;dp[i][1]表示以第i个元素结尾的乘积最小子数组的乘积。初始化dp数组的第一个元素为数组的第一个元素。遍历数组&#xff0c;…

c语言经典测试题11

1.题1 #include <stdio.h> int main() { int a[] {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}, *p a 5, *q NULL; *q *(p5); printf("%d %d\n", *p, *q); return 0; }上述代码的运行结果是什么呢&#xff1f; 我们来分析一下&#xff1a;我们创建了一个数…

《汇编语言》 第3版 (王爽)实验6解析

第7章 实验6解析 &#xff08;1&#xff09;.编程&#xff0c;完成问题7.9中的程序。 问题7.9 编程&#xff0c;将datasg段中每个单词的前4个字母改为大写字母。 assume cs:codesg,ss:stacksg,ds:datasgstacksg segment ;开辟了栈段空间&#xff0c;容量为16个字节dw 0,0,0,0…

Ai-WB2-32S在window下使用vs 和 msys2编译以及烧录

文章目录 前言一、使用前准备第一步 安装vscode第二步 安装msys2 二、使用步骤1.打开MSYS2 MINGW64&#xff08;1&#xff09;在开始栏中找到MSYS2 MINGW64并打开&#xff08;2&#xff09;安装git&#xff08;3&#xff09;安装make&#xff08;4&#xff09;安装好之后的文件…

C# 中 Interpreter 用于解释执行代码的工具

在 C# 中&#xff0c;Interpreter 是一个用于解释执行代码的工具&#xff0c;它提供了一种在运行时动态解释和执行 C# 代码的方式。Interpreter 类位于 Microsoft.CodeAnalysis.CSharp.Scripting 命名空间中&#xff0c;它允许你通过编写代码字符串来执行 C# 代码。 下面是一些…