QPointer类是一个模版类,是为QObject提供的一种监视指针。指针声明:QPointer<T> p ,p的操作跟普通的C++指针相似,但与C++指针最大的不同就是,当它引用的对象被销毁时指针p会自动为0。而不是像C++指针会变成野指针。
当你需要一个指针p引用别的对象A,而这个对象A在别地方可能一不小心被销毁了,而p还在指向对象。这种情况下,QPointer类型的指针将变得很有用,你可以安全的检查指针是否有效。
QPointer <QLabel> label = new QLabel;
label->setText("&Status:");
...dosomething….
if(label)
label->show();
如果label被销毁, label会变为0,label->show();便不会被执行,不用担心label变为野指针而引发的程序崩溃.。
QPointer类型的指针可以像普通的C++指针一样使用,普通的C++指针可以给QPointer指针赋值,比较 == 、!= 、解引用等操作,你也可以给参数为T * 的方法传QPointer<T>。
QPointer<QLabel> label = new QLabel(this);
QLabel *plbl = newQLabel(this);
if (label== plbl)
{
qDebug("equal pointer....");
}
else
{
qDebug("not equal pointer....");
}
label = plbl;
if (label== plbl)
{
qDebug("equal pointer....");
}
else
{
qDebug("not equal pointer....");
}
但是必须记住QPointer指针不支持算数运算,如+,-,++,--。
QLabel*labelArray[5];
for (int i = 0; i<5; ++i)
{
labelArray[i] = new QLabel ;
labelArray[i]->setText("Label" + QString::number(i));
}
QPointer<QLabel> pt;
pt = labelArray[0];
qDebug()<<pt->text();
pt++;
pt = pt + 2;
qDebug()<<pt->text();
这段代码:pt++;会引发编译错误,提示错误 ”QPointer<T> 不定义该运算符或到预定义运算符可接收的类型的转换。去掉pt++;后,执行到pt= pt + 2; ,程序崩溃
最重要的一点:QPointer<T>只能用于QObject的子类。否则会引发编译错误或者链接错误。
QPointer<int> pInt; //可以运行,不会出现任何错误
QPointer<int> pInt = new int(5); //编译错误,提示错误 无法从“int *”转换为“QObject*”