QT中的对象模型――QPointer
QPointer是一個(gè)模板類,為QObject對(duì)象提供了守衛(wèi)指針(Guarded Pointer)。什么是守衛(wèi)指針?守衛(wèi)指針QPointer<T>類似于普通C++指針T *,有且僅有一點(diǎn)不同:當(dāng)被引用的對(duì)象被刪除的時(shí)候,守衛(wèi)指針自動(dòng)設(shè)置為0,不像普通的C++指針將成為“野指針”。這里,T必須是QObject的子類。
什么時(shí)候使用守衛(wèi)指針?當(dāng)你需要維護(hù)一個(gè)別的類擁有的QObject對(duì)象的指針時(shí),你需要使用守衛(wèi)指針,因?yàn)槟憧梢院苋菀椎膶?duì)該指針進(jìn)行有效性判斷。
注意:相比于QT4,QT5中QPointer在行為上有了少許的變化:
當(dāng)使用QPointer指向QWidget時(shí),QT4中,QPointer將在QWidget的析構(gòu)函數(shù)中清除,而在QT5中,QPointer將在QObject的析構(gòu)函數(shù)中清除。
接下來上代碼:
#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();
}
運(yùn)行結(jié)果如下:
======================================================
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)
======================================================
從結(jié)果中可以看出我們直接刪除pLabel對(duì)象,沒有顯式重置label值,但QT框架幫我們重置了label的值。
運(yùn)行環(huán)境Qt5.5或者Qt5.6。
總結(jié)
以上是生活随笔為你收集整理的QT中的对象模型――QPointer的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 搭建Linux3.4.2内核编辑环境
- 下一篇: Java并行任务框架Fork/Join