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: 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)
======================================================
从结果中可以看出我们直接删除pLabel对象,没有显式重置label值,但QT框架帮我们重置了label的值。
运行环境Qt5.5或者Qt5.6。
最新文章
- C# MVC 页面静态化导致的问题
- zencart分类页产品页去掉url中的id号
- C# Reflection Type/MethodInfo
- 减少 WAF 漏报的 8 种方法 !
- 解决 iOS View Controller Push/Pop 时的黑影
- RSD和wlwmanifest是什么
- jquery简单封装
- java.lang.NoSuchMethodError: antlr.collections.AST.getLine()I
- Android 之异步任务(AsyncTask,Handler,Message,looper)
- freemarker写select组件(五)
- 查询sql 索引
- springboot使用lettuce连接池
- HTML table导出到Excel中的解决办法
- firmware 固件
- final发布视频展示博客
- Java 将数字转为16进制,然后转为字符串类型
- 用JIRA管理你的项目
- Redis-CentOS7安装
- Netty--Google Protobuf编解码
- length length()