[Q學習]2 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: Unable to set geometry 48x12+640+280 on QWidgetWindow/'QLabelClassW

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

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

after =  QWidget(0x0)

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

從結果中可以看出我們直接刪除pLabel對象,沒有顯式重置label值,但QT框架幫我們重置了label的值。

運行環境Qt5.6。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章