Qt的相关Pointer(1)-----QPointer

QPointer

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*”     

 

 

你可能感兴趣的:(Qt的相关Pointer(1)-----QPointer)