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

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