【QT】点击按钮弹出对话框的注意实现

news2024/11/19 11:28:08

在stack区创建对话框对象

模态对话框,不可以对其他窗口进行操作。 模态窗口用dlg.exec()显示窗口。


问题代码1:

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    //点击新建按钮,弹出一个对话框
    connect(ui->actionNew, &QAction::triggered, [this](){
        // 阻塞态对话框,只能有一个
        QDialog dlg(this);			// 在stack区创建 dlg
        dlg.resize(200,100);	
        
        //dlg.exec();					// 让窗口对象卡住,点击关闭,关闭窗口。

        qDebug() << "模态对话框弹出了";
    });
        
}

对象dlg,在stack区被创建。dlg 的生命周期在Lambda表达式内,当箭头函数结束时,会自动销毁 stack 区内存,窗口一闪即逝


正确写法,设置exec()函数:

    connect(ui->actionNew, &QAction::triggered, [this](){
        // 阻塞态对话框,只能有一个
        QDialog dlg(this);			// 在stack区创建 dlg
        dlg.resize(200,100);		 
        dlg.exec();					// 让窗口对象卡住,点击关闭,关闭窗口。

        qDebug() << "模态对话框弹出了";
    });

dlg.exec()相当于 while(1),让窗口对象持续存在。当手动叉掉对话框时,箭头函数就会结束,并自动销毁 stack 区内存,不会出现内存泄漏。


外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传



在堆区创建对话框对象

非模态对话框,可以对其他窗口进行操作。非模态窗口用dlg->show()显示窗口。


问题代码2:

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    //点击新建按钮,弹出一个对话框
    connect(ui->actionNew, &QAction::triggered, [this](){
        // 非模态对话框
        QDialog *dlg2 = new QDialog(this);
        dlg2->resize(200,100);
        dlg2->show();
        
        qDebug() << "非模态对话框弹出了";
    });

}

程序不会报错,运行结果和上图差不多。

但是,由于dlg2在堆区创建,当箭头函数结束时,堆区内存不会被自动释放。因此对话框会持续保留,不需要exec()函数卡住程序

又因为dlg2非模态对话框,可以无限创建。理论上讲,只要用户无限点击几天时间,就会占用大量堆区的内存。只要主程序没有结束,对象树的自动析构就不会起作用,即使叉掉对话框,也不会释放。这是一个重大的安全隐患。


正确写法,设置Qt::WA_DeleteOnClose属性:

    connect(ui->actionNew, &QAction::triggered, [this](){
        // 非模态对话框
        QDialog *dlg2 = new QDialog(this);
        dlg2->resize(200,100);
        dlg2->show();
        
        dlg2->setAttribute(Qt::WA_DeleteOnClose);  //55号属性
        
        qDebug() << "非模态对话框弹出了";
    });

未设置该属性时,你去关闭窗口,窗口资源不会立即释放,窗口只是"隐藏"了。当调用析构函数时,窗口资源才会真正释放。设置该属性后,我们关闭窗口,窗口资源会立即释放。



完整的示例代码

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);


    //点击新建按钮,弹出一个对话框
    connect(ui->actionNew, &QAction::triggered, [this](){
        // 阻塞态对话框
        QDialog dlg(this);
        dlg.resize(200,100);
        dlg.exec();

        qDebug() << "模态对话框弹出了";



        // 非模态对话框
        QDialog *dlg2 = new QDialog(this);
        dlg2->resize(200,100);
        dlg2->show();
        dlg2->setAttribute(Qt::WA_DeleteOnClose);  //55号属性
        qDebug() << "非模态对话框弹出了";
    });
}




参考连接:

setAttribute(Qt::WA_DeleteOnClose) 导致程序崩溃问题

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

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

相关文章

华为eNSP配置专题-IPSec的配置

文章目录 华为eNSP配置专题-IPSec的配置0、概要介绍1、前置环境1.1、宿主机1.2、eNSP模拟器 2、基本环境搭建2.1、终端构成和连接2.2、终端的基本配置 3、IPSec的配置3.1、通过ACL定义需要保护的数据流3.2、配置IPSec安全提议3.3、配置IPSec手动方式安全策略3.3.1、在R1上配置3…

05.大模型大数据量

文章目录 大模型顿悟时刻&#xff1a;Emergent Ability&#xff08;涌动现象&#xff09;Calibration Inverse Scaling PrizeSwitch Transformers 大数据量数据预处理去重 模型大小与训练数据的选择Instruction-tuningHuman TeachingKNN LM 部分截图来自原课程视频《2023李宏毅…

Java流(Stream)式编程

流式编程 Stream作为Java 8的一大亮点&#xff0c;它专门针对集合的各种操作提供各种非常便利&#xff0c;简单&#xff0c;高效的API,Stream API主要是通过Lambda表达式完成&#xff0c;极大的提高了程序的效率和可读性。 流式编程的概念基于函数式编程的思想&#xff0c;旨…

Linux云服务器限制ip进行ssh远程连接

对Linux云服务器限制IP进行SSH远程连接的原因主要有以下几点&#xff1a; 增加安全性&#xff1a;SSH是一种加密的网络传输协议&#xff0c;可以保护数据的机密性和完整性。通过限制SSH连接的IP地址&#xff0c;可以防止未经授权的访问和数据泄露。只有拥有访问权限的IP地址才…

DDOS版-超功能记事本 Ⅲ 8.8源码

DDOS版-超功能记事本 Ⅲ 8.8源码 下载地址&#xff1a;https://user.qzone.qq.com/512526231/main

ESB优势2019-架构师(六十二)

分布式数据数据库系统除了包含集中式数据库系统的模式结构外&#xff0c;还增加了几个模式级别&#xff0c;其中&#xff08;&#xff09;定义了分布式数据库中数据的整体逻辑结构、使得数据使用方便&#xff0c;如同没有分布一样。 分片模式全局外模式分布模式全局概念模式 …

jmeter疑难杂症

mac启动jmeter 进入jmeter文件夹下的bin目录 执行sh jmeter 如何线程与线程之间按照顺序执行 线程组内随机执行 选择线程组右键 >>> 添加 >>> 逻辑控制器 >>> 随机顺序控制器&#xff08;Random Order Controller&#xff09; 如何提取cookie的…

【MyBatis Plus】初识 MyBatis Plus,在 Spring Boot 项目中集成 MyBatis Plus,理解常用注解以及常见配置

文章目录 一、初识 MyBatis Plus1.1 MyBatis Plus 是什么1.2 MyBatis Plus 和 MyBatis 的区别 二、在 Spring Boot 项目中集成 MyBatis Plus2.1 环境准备2.2 引入 MyBatis Plus 依赖2.3 定义 Mapper2.4 测试 MyBatis Plus 的使用 三、MyBatis Plus 常用注解3.1 为什么需要注解3…

Android12之#pragma clang diagnostic ignored总结(一百六十八)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

性能卓越 全栈自主 HashData与华为金融数仓一体机联合方案全面解读

​金融业作为数据覆盖广泛、服务社会主体众多、应用场景丰富的关键行业&#xff0c;一直以对数据基础设施的高要求而著称&#xff0c;也是检验产品与方案成熟度的试金石。经过长期的服务与实践&#xff0c;HashData已形成面向金融核心业务的成熟数仓产品。 凭借对金融场景的深…

基于Python Django 的微博舆论、微博情感分析可视化系统(V2.0)

文章目录 1 简介2 意义3 技术栈Django 4 效果图微博首页情感分析关键词分析热门评论舆情预测 5 推荐阅读 1 简介 基于Python的微博舆论分析&#xff0c;微博情感分析可视化系统&#xff0c;项目后端分爬虫模块、数据分析模块、数据存储模块、业务逻辑模块组成。 Python基于微博…

计算文本相似度,输出相似度最高的n个

TF-IDF import jieba import pandas as pd from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.metrics.pairwise import cosine_similarity# 示例句子列表 sentences ["今天天气真好&#xff0c;阳光明媚。","关键字匹配是一种常见的…

什么是虚拟主播?

随着科技的不断发展&#xff0c;人工智能技术已经逐渐渗透到各个行业&#xff0c;为企业带来了前所未有的变革。在视频制作领域&#xff0c;美摄作为一家领先的智能视频技术提供商&#xff0c;针对企业需求推出了一款创新的虚拟主播解决方案&#xff0c;旨在帮助企业实现高效、…

「滚雪球学Java」:常用类(章节汇总)

&#x1f3c6;本文收录于「滚雪球学Java」专栏&#xff0c;专业攻坚指数级提升&#xff0c;助你一臂之力&#xff0c;带你早日登顶&#x1f680;&#xff0c;欢迎大家关注&&收藏&#xff01;持续更新中&#xff0c;up&#xff01;up&#xff01;up&#xff01;&#xf…

机器学习实验六:决策树-海洋生物例子

#创建数据集 import numpy as np import pandas as pd from sklearn import tree from sklearn.tree import DecisionTreeClassifier import graphviz def createDataSet():row_data {no surfacing:[1,1,1,0,0],flippers:[1,1,0,1,1],fish:[yes,yes,no,no,no]}dataSet pd.Dat…

轻松搭建Linux宝塔面板并实现公网访问Discuz论坛,让您的论坛更具吸引力

文章目录 前言1.安装基础环境2.一键部署Discuz3.安装cpolar工具4.配置域名访问Discuz5.固定域名公网地址6.配置Discuz论坛 前言 Crossday Discuz! Board&#xff08;以下简称 Discuz!&#xff09;是一套通用的社区论坛软件系统&#xff0c;用户可以在不需要任何编程的基础上&a…

js中的Formdata数据结构

这里写目录标题 一、基本概念二、常用方法1.append(name, value)、set(name, value)2.get()、getAll()3.has(name)4.delete(name)5.keys(),values(),entries() 三、其他细节1.for of遍历2.转为对象3.结合 URLSearchParams 转为queryString 一、基本概念 FormData 提供了一种表…

推送内容有误怎么办?MobPush撤回/取消推送为您排忧解难

消息推送已成为深度连接APP和用户的利器&#xff0c;对推送内容的准确性和时效性的要求也更为严格&#xff0c;倘若推送的内容出现错误&#xff0c;或推送的内容已经失去了时效性&#xff0c;此时又该怎么办呢&#xff1f;别急&#xff0c;近日MobPush全新上线了取消推送和撤回…

Lightroom学习之路

基础知识 常用快捷键 双击修改图片下右边布局的属性&#xff0c;快速回到初始值 B站学习笔记 1、导入到图库为图片标星级&#xff0c;后期优先处理星级高的图片 2、修改照片-基础-白平衡有吸管吸颜色会自动平衡照片颜色 3、直方图左右上角三角形&#xff0c;选中后照片会显示…

04 # 手写 apply

apply apply 的作用跟 call 的作用是一样的&#xff0c;只不过传递的参数是以数组的形式 手写 apply <script>Function.prototype.kaimoApply function (content, args) {// 没有东西指向 window&#xff0c;将 content 包装成对象content content ? Object(conten…