一、前语 “工欲善其事,必先利其器”,上一节,我介绍了Qt的装置和装备办法,搭建了根本的开发渠道。这一节,来经过一个简略的比如来了解Qt的编程款式和规范,开端喽~~~
回到顶部(go to top)
二、第一个程序——Hello World 首要,咱们可以按照上一节的办法树立一个新的工程,工程的姓名可以就叫做Hello,随你的便。在创立工程的过程中,有一个挑选是否创立视图界面的选项,这个可以先不挑选,由于咱们现在仅仅了解Qt的机制,不需要Qt帮咱们做太多的作业,创立完成后,翻开main.cpp。
我做的作业首要便是:
1、屏蔽掉程序自己的对话框程序代码;
2、增加一个label控件,并给他传一个文本值,最终显现。
最终的显现成果:
其次,咱们来剖析一下Qt的根本流程。1~3行是头文件包括,这儿有两种头文件,第一种是自定义头文件或许本地头文件,用“ ”来进行表明和包括;第二种是体系头文件,这儿便是Qt自带的头文件,直接用>进行表明和包括就可以。第7行是创立一个QApplication的实例,关于 Qt 程序来说,main()函数一般以创立 application 目标(GUI 程序是QApplication,非 GUI 程序是QCoreApplication。QApplication实践上是QCoreApplication的子类。),这个目标用于办理 Qt 程序的生命周期,敞开事情循环。10~11行是中心代码,也便是咱们实践增加的用例代码,这儿我创立了一个QLabel,运用结构函数对其进行赋值操作,最终调用show办法将其显现出来。最终一行调用exec,敞开事情循环(可以了解成一段无线循环)。
写完这两句代码之后,咱们想一个问题,这儿咱们先不评论Qt的音讯机制和其他的通讯原理,单纯从C++方面考虑程序的稳定性和鲁棒性。
问题1:我创立的QLabel是创立在栈上的仍是堆上的?
问题2:假如我把QLabel变量创立为堆上变量,应该留意哪些问题?
咱们先来评论问题1,这个应该没有什么争议,Qlabel变量是创立在栈上的。再来看看问题2,假如我由于某些需求将变量声明为堆上变量,那么这个时分我就要给这个变量分配空间。这个时分问题就来了,分配空间了,程序完毕后谁来开释啊?内存走漏了怎样办啊?怎样可以避免内存走漏啊?假如咱们对其不管不顾,在程序完毕后,操作体系会将其收回,可是,咱们看到label 是树立在堆上的,app 是树立在栈上的。这意味着,label 会在 app 之后析构。也便是说,label 的生命周期善于 app 的生命周期。这可是 Qt 编程的大忌。由于在 Qt 中,一切的QPaintDevice有必要要在有QApplication实例的情况下创立和运用。咱们猎奇的话,可以提一句,QLabel承继自QWidget,QWidget则是QPaintDevice的子类。之所以上面的代码不会有问题,是由于 app 退出时,label 现已封闭,这样的话,label 的一切QPaintDevice一般都不会被拜访到了。可是,假如咱们的程序,在 app 退出时,组件却没有封闭,这就会形成程序溃散。
此外,这儿的程序没有溃散的另一个原因是假如在主函数结束,可以不开释;在其它区域结束,new出来的内存是逆序开释的,这是c++规范的规则。
这个时分,或许知道C++11规范的童鞋想到了智能指针。没错,智能指针是可以作为指针的保管类来完成指针的主动开释,可是智能指针假如用欠好同样会发生各式各样的问题,因而,主张刚开端学习的同学,能不必堆上变量就先不要用,假如真要用的话,记住想好内容溢出和走漏的问题并采纳必要的防备办法或许不运用智能指针,给变量增加特点。
label->setAttribute(Qt::WA_DeleteOnClose);
这时,咱们回头去看exec办法,由于如此,咱们在栈上构建了QLabel目标,却可以一向显现在那里(试想,假如不是无限循环,main()函数马上会退出,QLabel目标当然也就直接析构了)。
最终,为咱们附上堆上变量和智能指针的声明方法,仅供参阅。
2.1 堆上代码参阅
1 #include
2 #include
3
4 int main(int argc ,char **argv)
5 {
6 QApplication a(argc,argv);
7 QLabel *label =new QLabel(Hello world);
8 label->show();
9
10 return a.exec();
11 }
2.2 智能指针代码参阅(Sailfish OS)
1 #include
2
3 int main(int argc, char *argv[])
4 {
5 QScopedPointer
6 QScopedPointer
7 view->setSource(/path/to/main.qml);
8 …
9 return app->exec();
10 }
三、我的观念 关于指针的运用方法和当地的挑选这个确实是见仁见智的,我自己关于指针的运用是很当心的,假如运用的话也会在一些不牵扯线程安全的情况下运用,而且打印日志陈述。别的一个问题便是指针的开释和重用问题,我的观念是假如在指针被开释的效果域进行delete的操作,可是并没有置为null,这个时分指针应该是还可以运用的,仅仅没有交还给操作体系罢了,如有误解,请纠正。
no pains ,no gains. 给自己加油,为未来斗争。