QPointer是一个模板类,为QObject对象提供了守卫指针(Guarded Pointer)。什么是守卫指针?守卫指针QPointer<T>类似于普通C++指针T *,有且仅有一点不同:当被引用的对象被删除的时候,守卫指针自动设置为0,不像普通的C++指针将成为“野指针”。这里,T必须是QObject的子类。

什么时候使用守卫指针?当你需要维护一个别的类拥有的QObject对象的指针时,你需要使用守卫指针,因为你可以很容易的对该指针进行有效性判断。

注意:相比于QT4,QT5中QPointer在行为上有了少许的变化:

当使用QPointer指向QWidget时,QT4中,QPointer将在QWidget的析构函数中清除,而在QT5中,QPointer将在QObject的析构函数中清除。

接下来上代码:

    #include <QPointer>
    #include <QDebug>
    #include <QLabel>
    #include <QApplication>
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
    
        QLabel *pLabel = new QLabel();
        QPointer<QLabel> label = pLabel;
        label->setText("&Status:");
        qDebug() << "before = " << label;
        if (label)
           label->show();
        delete pLabel;
        qDebug() << "after = " << label;
    
        return a.exec();
    }

运行结果如下:

======================================================

before=  QLabel(0x152fd668)

setGeometry: Unableto set geometry 48x12+640+280 on QWidgetWindow/'QLabelClassW

indow'. Resultinggeometry:  116x12+640+280 (frame: 8, 30,8, 8, custom margin:

0, 0, 0, 0, minimumsize: 0x0, maximum size: 16777215x16777215).

after=  QWidget(0x0)

======================================================

从结果中可以看出我们直接删除pLabel对象,没有显式重置label值,但QT框架帮我们重置了label的值。

运行环境Qt5.5或者Qt5.6。

QT中的对象模型――QPointer的更多相关文章

  1. Qt 中的对象模型(Object Model)

    原标题:Qt 中的对象模型(Object Model)90不太后,余生皆折腾 本节内容主要讲了 Qt 对象模型比标准 C++ 对象模型多了什么内容,并介绍了组成 Qt 对象模型基础的相关的类.最后说明 ...

  2. Qt中的事件

    1. 引自---http://blog.sina.com.cn/s/blog_6e80f1390100pro4.html 信号和事件的区别就在与,事件比信号更加底层,而且如果一个信号对应多个槽的话,信 ...

  3. Qt 中的事件处理(一)

    1.图形界面应用程序的消息处理模型 特点: 基于操作系统才能运行 GUI应用程序提供的功能必须由用户触发 用户操作界面时操作系统是第一个感知的 系统内核的消息通过事件处理转变成QT的信号 2. Qt中 ...

  4. Qt中delete的问题

    最近项目遇到了一个bug,压力测试ui总会崩溃,gdb调试未果,跑到了库函数,无从查起: (gdb)bt #0 0x4146b1e4 in QWidgetPrivate::drawWidget(QPa ...

  5. 智能指针类模板(中)——Qt中的智能指针

    Qt中的智能指针-QPointer .当其指向的对象被销毁时,它会被自动置空 .析构时不会自动销毁所指向的对象-QSharedPointer .引用计数型智能指针 .可以被自由的拷贝和赋值 .当引用计 ...

  6. Qt 中使用Singleton模式需小心

    在qt中,使用Singleton模式时一定要小心.因为Singleton模式中使用的是静态对象,静态对象是直到程序结束才被释放的,然而,一旦把该静态对象纳入了Qt的父子对象体系,就会导致不明确的行为. ...

  7. qt中ui的 使用介绍

    1.什么是ui?ui通常是用Qt 设计师设计出来的界面文件的后缀.通常情况下ui是一个指向这个界面类的指针.ui-> 一般就是用来访问这个界面类里面的控件.例如你的ui文件里有一个叫okButt ...

  8. Qt中 QString 和int, char等的“相互”转换

    转载:http://blog.csdn.net/ei__nino/article/details/7297791 Qt中 int ,float ,double转换为QString 有两种方法 1.使用 ...

  9. QT 中 关键字讲解(emit,signal,slot)

    Qt中的类库有接近一半是从基类QObject上继承下来,信号与反应槽(signals/slot)机制就是用来在QObject类或其子类间通讯的方法.作为一种通用的处理机制,信号与反应槽非常灵活,可以携 ...

随机推荐

  1. 个人博客开发之blog-api 项目全局日志拦截记录

    前言 大型完善项目中肯定是需要一个全局日志拦截,记录每次接口访问相关信息,包括: 访问ip,访问设备,请求参数,响应结果,响应时间,开始请求时间,访问接口描述,访问的用户,接口地址,请求类型,便于项目 ...

  2. C语言:常用数学函数

    #include <stdio.h> #include <math.h> #include <stdlib.h> #include <time.h> # ...

  3. RPC远程协议之原理分析

    在近几年工作中发现,功能服务化或微服务化越来越流行,逐渐成为实现中大型分布式系统架构的主要方式,而在分布式系统中的不同节点应用间的通信中,RPC远程协议扮演关键作用.实际上,在日常工作中,我们也多多少 ...

  4. final修饰符(4)-"宏替换"

    对于一个final变量来说,不管它时类变量,实例变量还是局部变量,只要满足三个条件,这个final变量就不再是一个变量,而是一个直接量.final变量的一个重要用途,就是定义"宏变量&quo ...

  5. 跟我一起学Go系列:gRPC 全局数据传输和超时处理

    gRPC 在多个 GoRoutine 之间传递数据使用的是 Go SDK 提供的 Context 包.关于 Context 的使用可以看我之前的一篇文章:Context 使用. 但是 Context ...

  6. 优化 Workerman 检查主进程是否存活的逻辑

    主要新增了判断进程是否为 Workerman 进程的逻辑,从而优化了确定主进程是否存活的准确性 发现问题 年前逛 GitHub 的时候,发现 Workerman 有一个 2017 年打开的 Issue ...

  7. GIS数据资源下载

    GeoJSON数据下载 1.全国.省.市.县级geojson数据下载 地址:http://datav.aliyun.com/tools/atlas/#&lat=33.5219039961561 ...

  8. StringIO和BytesIO的用法

    数据读写有两种方式: 1.直接读写.案例 import openpyxl def write_excel(): f = openpyxl.Workbook() # 创建工作簿 # sheet1 = f ...

  9. jvm源码解读--13 gc_root中的栈中oop的mark 和copy 过程分析

    粘贴源码 package com.test; import java.util.Random; public class Test { static int number=12; private in ...

  10. frame window 和open 的关系

    建立一个如下的关系框架 windowA.html <!DOCTYPE html> <html lang="en"> <head> <met ...