QT_学习笔记

1.       在堆上用new分配的内存,为什么没有用delete释放?

从HelloQt说起

#include <qapplication.h>
#include <qlabel.h>
int main( int argc, char **argv )
{
   
    QApplication app( argc, argv );
   QLabel *label=new QLabel(“Hello QT!”,0);
    app.setMainWidget( label );
    label->show();
    return a.exec();
}

这里label是new出来的一个指针变量,也就是在堆上申请的内存,在C++语言里,明确过,在堆上分配的内存是必须认为的用delete释放的,防止内存泄露。这里为什么没有呢。后来看到有的QT程序也有明确使用delete释放内存的。这里越发不解了。后来,查到原来是QT扩展了C++,如果指针对象有父对象时,可以不用显式释放内存。我们需要显式释放的是那些没有父对象的孤立的指针。但上面这个例子并没有继承父对象,注意第二个指针,指向父对象的指针参数为0,即没有父对象,但是setMainWidget把它设为了主窗口部件,它就和程序同步了,当程序退出的时候自动释放,孩子对象的释放也是如此,在QT中扩展了C++ ,如果父亲对象无效时,子对象自动释放分配的内存。

2.        关于前置声明的说明

前置声明是C++ 的一个特性,不过我是在学QT时才接触到。这里有一些说明。

         #include <qapplication.h>

     class QCheckBox;

     class myClass:public QDialog

         {

                   Q_OBJECT

          public:

                         --------

          signals:

---------

          private:

                   QCheckBox *myCheck;

};

这里定义了一个示例类,继承于QDialog,其中用Q_OBJECT宏是因为声明的类定义了自己的signals,其中第二行就是一种前置声明,因为私有成员里用到了此类,这种方法比#include <qcheckbox.h>编译速度要快,注意私有成员为一个指针,如果是个私有对象而不是指针的话就不能用这种前置声明。具体的理由可以参考C++关于前置声明的说明,这里只是一个提醒

 

 以上两点参考: 1,2两点源文引用,感谢原作者

 

3.   控件内存释放

   Qt中,如果申明了两个数组:

   QLabel        *label[8];
   QLabel        *sLabel[8];

   这两个都是QLabel类型的指针数组,希望在以后的使用中动态的分配其内存;
   那么就应该:
 
   在class MyLabel中...

   for(int i=0;i<8;i++)
   {
       label[i] = new QLabel("This is a Label",this,0);
       //申请空间.   
       sLabel[i] = new QLabel("",label[i],0);
       //第二个Label指针数组的父对象为上面申请过空间的Label.
   }

   QLabel的构造函数的原形为:

   QLabel ( const QString & text, QWidget * parent, const char * name = 0, WFlags f = 0 )

   text:       Label上要显示的字符串;
   parent:     Label的父对象的指针;
   name:       Label的名字;
   f:          Label的Flags;

   从上面的代码容易得知label数组每个元素是以当前MyLabel类对象为父对象的;而sLabel里的元素是以对应的label为父对象的;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值