zoukankan      html  css  js  c++  java
  • QT中的对象模型――QPointer

    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。

  • 相关阅读:
    浅谈Oracle12c 数据库、用户、CDB与PDB之间的关系
    ECLIPSE快捷键
    Oracle12cWindows安装、介绍及简单使用(图文)
    金士顿DT100 G3 PS2251-07海力士U盘量产修复成功教程
    tomcat绑定域名
    TCP慢启动、拥塞避免、快速重传、快速恢复
    理解HTTP幂等性
    TCP协议缺陷不完全记录
    Nginx模块开发入门
    一步步构建大型网站架构
  • 原文地址:https://www.cnblogs.com/bruce1992/p/14308380.html
Copyright © 2011-2022 走看看