关闭
关闭
首页 > 嵌入式软件 > QT

 一、前言  “工欲善其事,必先利其器”,上一节,我介绍了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 app(new QApplication(argc, argv));

6 QScopedPointer view(new QQuickView);

7 view->setSource("/path/to/main.qml");

8 ...

9 return app->exec();

10 }

 


三、我的观点  关于指针的使用方式和地方的选择这个确实是见仁见智的,我自己对于指针的使用是很小心的,如果使用的话也会在一些不牵扯线程安全的情况下使用,并且打印日志报告。另外一个问题就是指针的释放和重用问题,我的观点是如果在指针被释放的作用域进行delete的操作,但是并没有置为null,这个时候指针应该是还能够使用的,只是没有交还给操作系统而已,如有误解,请指正。

no pains ,no gains. 给自己加油,为未来奋斗。

换一批

延伸阅读

[行业资讯] Qt5.3重磅登场:增强跨平台性与全新收费模式

Qt5.3重磅登场:增强跨平台性与全新收费模式

移动设备操作系统种类的不断增加,开发者在开发应用的时候需要针对不同的平台分别开发APP,这既增加了开发者投入的成本,又延缓了APP上架的时间。但是,开发者热衷于多个平......

关键字: Qt5.3 Digia Qt开发者大会

[新鲜事] 不差钱!英国砸10亿英镑建设5G网络基础设施

不差钱!英国砸10亿英镑建设5G网络基础设施

在不远的将来,英国 200 万个家庭及商户即将迎来超快网速时代。今年秋季,英国财政大臣 Philip Hammond 在政府的预算报告中指出,将拨款 7.4 亿英镑用于 5G 建设,改善英国网络基础设施。其中 4 亿英镑计划为英国家庭......

关键字:英国 5G 网络通信

[趣科技] NASA打印出了复杂的“太空织物金属”:具两面不同的特性

NASA打印出了复杂的“太空织物金属”:具两面不同的特性

NASA 用到了 3D 打印技术,这种“金属织物”可以逐个连接到一起。......

关键字:3D打印 NASA 天文 材料科学

[新鲜事] 生物打印向我们展示了更多的人造皮肤

生物打印向我们展示了更多的人造皮肤

据外媒报道,近日马德里卡洛斯三世大学的一个研究团队打造了一种生物打印机,据称可以3D打印出功能性仿人类皮肤,可以用于研究或者植皮等。据悉,这种生物打印机使用了由血浆、蛋白质及、皮肤细胞等组成的“生物墨水”。研究人员通过连接计算机并以精确的方......

关键字:生物打印 人造皮肤

[新鲜事] 双方“互撕”?Facebook股东要求马克·扎克伯格退出董事会

双方“互撕”?Facebook股东要求马克·扎克伯格退出董事会

据外媒报道,Facebook面临部分股东要求首席执行官马克·扎克伯格(Mark Zuckerberg)退出董事会的压力。部分股东在一份提案中称,独立董事长将能更好地“监督公司高管,改进公司治理,制定更负责任、对股东更有利的议程”。......

关键字:facebook 马克·扎克伯格

[新鲜事] 三星SDI电池与特斯拉对手Lucid Motors签下电池供应协议

三星SDI电池与特斯拉对手Lucid Motors签下电池供应协议

在经历了NOTE 7爆炸门后,SDI电池还能签下硅谷电动汽车创业公司,这不得不说三星的厉害。相比于特斯拉同松下一起造超级电池工厂,Lucid Motors电动汽车的方案更简单粗暴,不过特斯拉画的饼更大一些——建造......

关键字:三星 SDI 电池 电动汽车
条评论

我 要 评 论

网友评论

大家都爱看

  • 华为的优势,就是自家的各种自研芯片

    CPU即中央处理器,是一块超大规模的集成电路,是一台计算机的运算核心和控制核心。它的功能主要是解释计算机指令以及处理计算机软件中的数据。

    2017-08-16
  • 你不知道Ryzen芯片有多火?来看看AMD的股票吧

    据外媒报道,美银美林认为,AMD最新的Ryzen芯片可能会引发一波销售浪潮,进而推动该股继续上涨。它认为AMD股票还有40%以上的上涨空间。

    2017-08-16
  • 国产芯片:厚积薄发,强势崛起

    关于国产芯片,是近几年才有崛起的势头,可是在几年之前,国产芯片还处于“沉睡”的状态,尤其是手机芯片,几乎大部分都依赖进口,而且国外的市场几乎被高通和联发科所垄断,也就展讯还在市场边…

    2017-08-16
  • 为了数据安全 大疆无人机增加隐私飞行功能

    大疆周一表示,在美国陆军因为“网络缺陷”而要求其成员停用大疆无人机后,这家中国无人机制造商将加强无人机的数据安全性。 大疆政策和法务副总裁布伦丹&middot…

    2017-08-15
  • Intel代工 展讯发布14nm SC9853I手机SoC

    SC9853I采用的Intel的14nm FinFET制程,架构为8核64位Airmont架构,主频1.8GHz,GPU为Mali-T820 MP2,号称面向799~1299元档次的手机。…

    2017-08-15