[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。