首页 > 其他分享 >QPointer的使用以及场景

QPointer的使用以及场景

时间:2023-06-06 12:02:08浏览次数:31  
标签:QPointer p2 场景 指向 p1 QWidget 使用 qDebug

QPointer的使用以及场景

在我们项目开发中,经常会遇到这种情况,在A中引用了B的对象,但是你却不知道B什么时候会析构,所以使用它会出现异常;所以今天的主角要登场了QPointer可以完美的解决这样的问题。

先来看一下介绍

 

The QPointer class is a template class that provides guarded pointers to QObject. A guarded pointer, behaves like a normal C++ pointer T *, except that it is automatically cleared when the referenced object is destroyed (unlike normal C++ pointers, which become “dangling pointers” in such cases).

T must be a subclass of QObject.

官方已经很清楚了,提炼一下,QPointer是一个模版类,指向的对象必须是QObject的派生类,声明的方式是OPointer<T> p1;

下面看一下具体的代码

QWidget* p1 = new QWidget();
    QWidget* p2 = p1;
    delete p1;
    p1 = Q_NULLPTR;
    qDebug()<<"delete p1";
    if(p2)
    {
        qDebug()<<"p2 is not NULL,p2 call show Widget";
        p2->show();
        qDebug()<<"Widget show";
    }
    else
    {
        qDebug()<<"p2 is NULL";
    }

————————————————

运行结果

delete pw

pw2 is not NULL,pw2 call show Widget

 

程序异常结束。

 

这个结果说明当p1指向的对象被析构时,p2指向的对象自然时析构了(他们指向的同一个对象),但是p2的指针不是一个空指针,所一程序qDebug()<<“Widget show”;没有执行程序就Crash了。

 

让我们把它改写成QPointer

 

 

QWidget* p1 = new QWidget();
 
    QPointer<QWidget> p2 = p1;
 
    delete p1;
 
    p1 = Q_NULLPTR;
 
    qDebug()<<"delete p1";
 
    if(p2)
 
    {
 
        qDebug()<<"p2 is not NULL,p2 call show Widget";
 
        p2->show();
 
        qDebug()<<"Widget show";
 
    }
 
    else
 
    {
 
        qDebug()<<"p2 is NULL";
 
    }

————————————————

 

运行结果

delete p1

p2 is NULL

 

 

这个结果说明当p1指向的对象被析构时,p2的指针被置为空了,所以输出了“p2 is NULL";

 

从这两段代码来看我们可以直观的了解到QPointer的用法以及使用场景,但是一定要注意的是指向的对象必须是继承于QObject,至于为什么大家可以看看源码,或者我有时间在写一下它的实现原理。

 



标签:QPointer,p2,场景,指向,p1,QWidget,使用,qDebug
From: https://blog.51cto.com/u_4018548/6423694

相关文章

  • Linux中grep命令如何使用?其语法是什么?
    在Linux中,grep命令用于查找文件里符合条件的字符串或正则表达式,其语法为“grep选项模式文件”,是运维工程师常用的命令之一。接下来这篇文章为大家详细介绍一下Linuxgrep命令,快来看看吧。Linuxgrep命令用于查找文件里符合条件的字符串或正则表达式。grep指令用于......
  • “AI Earth”人工智能创新挑战赛:助力精准气象和海洋预测Baseline[1]、NetCDF4使用教学
    1.“AIEarth”人工智能创新挑战赛:助力精准气象和海洋预测Baseline[1]、NetCDF4使用教学、Xarray使用教学,针对气象领域.nc文件读取处理比赛官网:https://tianchi.aliyun.com/specials/promotion/aiearth2021?spm=a2c22.12281976.0.0.4d0d19efK2FngK1.1背景描述聚焦全球大气海......
  • Ubuntu下git的安装与使用
    Ubuntu下git的安装与使用Ubuntu下git的安装与使用与Windows下的大致相同,只不过个人感觉在Ubuntu下使用git更方便。首先,确认你的系统是否已安装git,可以通过git指令进行查看,如果没有,在命令行模式下输入sudoapt-getinstallgit命令进行安装。安装完成后进行git配置,输入指令gitconfi......
  • vite + react + arco-design-mobile 使用 babel-plugin-import 实现按需加载
    0.什么是vite?vite是一种新型前端构建工具。一个开发服务器,它基于原生ES模块提供丰富的内建功能一套构建指令,它使用Rollup打包你的代码,可输出用于生产环境的高度优化过的静态资源1.什么是babel?babel是一个javasctipt编译器,他是一个工具链,主要用于在当前浏览器和旧浏览器......
  • 浅谈mysql索引类型(normal、unique、full textl) 的区别和使用场景
    mysql索引类型mysql索引类型normal,unique,fulltext的区别是什么?normal:表示普通索引unique:表示唯一的,不允许重复的索引,如果该字段信息保证不会重复例如身份证号用作索引时,可设置为uniquefulltextl:表示全文搜索的索引。FULLTEXT用于搜索很长一篇文章的时候,效果最好。用在......
  • Java开发手册中为什么禁止使用isSuccess作为布尔类型变量名以及POJO中基本类型与包装
    场景Java开发手册中关于POJO的布尔类型的变量名的要求是:【强制】POJO类中的任何布尔类型的变量,都不要加is前缀,否则部分框架解析会引起序列化错误。说明:在本文MySQL规约中的建表约定第一条,表达是与否的变量采用is_xxx的命名方式,所以,需要在<resultMap>设置从is_xxx到......
  • 信创操作系统--麒麟Kylin桌面操作系统 (项目十三 使用 Windows 软件)
    1.Wine介绍Wine是“wineIsNotanEmulator”的首字母缩写,它是一个能够在多种POSIX兼容操作系统(如Linux、macOS以及BSD等操作系统)上运行Windows应用程序的兼容层,是一个开源软件。Wine不像虚拟机软件一样模拟整个Windows操作系统,而是把WindowsAPI调用动态转换成本......
  • AD 域服务简介(一)- 基于 LDAP 的 AD 域服务器搭建及其使用(转)
    一、前言1.1AD域服务什么是目录(directory)呢?日常生活中使用的电话薄内记录着亲朋好友的姓名、电话与地址等数据,它就是telephonedirectory(电话目录);计算机中的文件系统(filesystem)内记录着文件的文件名、大小与日期等数据,它就是filedirectory(文件目录)。如果这些目录内的数......
  • Docker安装MS SQL Server并使用Navicat远程连接
    思维导航MSSQLServer简介基于Ubuntu的MicrosoftSQLServer官方镜像拉取Microsoft SQLServer2022容器镜像验证mssql镜像是否成功拉取到本地创建并运行一个mssql容器注意大坑使用Docker部署SqlServer容器后过几秒就停止了验证容器是否创建成功设置Docker主机防......
  • 如何使用TypeScript和Styled-Components构建图像轮播组件
    近年来,OTT(over-the-top)视频流媒体平台变得更加创新和易于使用。在他们的用户界面中,电影和连续剧的标题排列得清晰可见。在本教程中,我将指导您完成创建图像轮播组件的过程,该组件看起来就像您在许多OTT平台(想想Netflix)上看到的一样。我们将从创建原子组件开始,例如Tags、Descrip......