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

news/2024/10/20 16:10:38/

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.ppmy.cn/news/1372589.html

相关文章

探索Terraform实践:优化基础设施管理

Terraform 是管理基础设施及代码&#xff08;IaC&#xff09;最常用的工具之一&#xff0c;它能使我们安全且可预测地对基础设施应用更改。 Terraform作为一个强大的基础设施即代码工具&#xff0c;为开发人员和运维团队提供了一种简单而强大的方式来定义、部署和管理基础设施。…

flutter打包app

Flutter 打包APP &#xff08;Android & IOS&#xff09;_encountered error while building for device.-CSDN博客 使用命令行 keytool -genkey -v -keystore ../key -keyalg RSA -keysize 2048 -validity 10000 -alias key 将在文件根目录上一层生成key文件&#xff0…

PyTorch2.0 环境搭建详细步骤(Nvidia显卡)

Step 1 、查看显卡驱动版本 Step2、下载CUDA 11.7 或者11.8&#xff08;我自己用的这个&#xff09;也行,稍后我会贴出来版本匹配对应表 CUDA Toolkit - Free Tools and Training | NVIDIA Developer Step3、下载CUDNN cuDNN 9.0.0 Downloads | NVIDIA Developer Step4、安装…

uniapp iOS 真机调试

一、下载爱思助手 二、打开爱思助手&#xff0c;把你的 苹果手机 用原装数据线连接至电脑&#xff1a; 找到 工具箱 > 搜索IPA > 打开IAP签名 三、添加 IPA 文件 mac&#xff1a;finder 》应用程序 》右键 HbuilderX 》显示包内容 》HbuilderX / plugins/ lau…

Java基础 - 8 - 算法、正则表达式

一. 算法 什么是算法&#xff1f; 解决某个实际问题的过程和方法 学习算法的技巧&#xff1f; 先搞清楚算法的流程&#xff0c;再直接去推敲如何写算法 1.1 排序算法 1.1.1 冒泡排序 每次从数组中找出最大值放在数组的后面去 public class demo {public static void main(S…

navicat想把自己库中的表导出给别人的操作

navicat导出表和导入表 导出 右键需要导出的表&#xff0c;选择导出向导 选择csv&#xff0c;然后点击下一步 到这个页面&#xff0c;其实可以不用选择&#xff0c;会自己选择当时选中的表&#xff0c;如果有多张表导出&#xff0c;可以选择其他表。然后点击下一步 到这里是选…

upload-Labs靶场“11-15”关通关教程

君衍. 一、第十一关 %00截断GET上传1、源码分析2、%00截断GET上传 二、第十二关 %00截断POST上传1、源码分析2、%00截断POST上传 三、第十三关 文件头检测绕过1、源码分析2、文件头检测绕过 四、第十四关 图片检测绕过上传1、源码分析2、图片马绕过上传 五、第十五关 图片检测绕…

【unity】shader优化总结-转载

分为三个部分&#xff1a;Unity官方文档&#xff0c;GDC&#xff0c;个人经验。 Unity Manual 1.计算量优化。着色器进行的计算和处理越多&#xff0c;对性能的影响越大。针对不影响最终效果但依然进行计算的无效代码&#xff0c;进行移除操作。计算的频率也会影响游戏的性能…