[QT入门篇]2 QT中的对象模型——QPointer

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

何时使用守卫指针?当你须要维护一个别的类拥有的QObject对象的指针时,你须要使用守卫指针,由于你能够很容易的对该指针进行有效性判断。ide

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

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

接下来上代码:指针

    #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();
    }

运行结果以下:对象

======================================================get

before=  QLabel(0x152fd668)it

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

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。