我想去QT给个 号

  &工欲善其事,必先利其器&,上一节,我介绍了Qt的安装和配置方法,搭建了基本的开发平台。这一节,来通过一个简单的例子来了解Qt的编程样式和规范,开始喽~~~
二、第一个程序&&Hello World
  首先,我们可以按照上一节的方法建立一个新的工程,工程的名字可以就叫做Hello,随你的便。在创建工程的过程中,有一个选择是否创建视图界面的选项,这个可以先不选择,因为我们现在只是了解Qt的机制,不需要Qt帮我们做太多的事情,创建完成后,打开main.cpp。
  我做的工作主要就是:
1、屏蔽掉程序自己的对话框程序代码;
2、添加一个label控件,并给他传一个文本值,最后显示。
最后的显示结果:
  & 其次,我们来分析一下Qt的基本流程。1~3行是头文件包含,这里有两种头文件,第一种是自定义头文件或者本地头文件,用& &来进行表示和包含;第二种是系统头文件,这里就是Qt自带的头文件,直接用&&进行表示和包含就可以。第7行是创建一个QApplication的实例,对于 Qt 程序来说,main()函数一般以创建 application 对象(GUI 程序是,非 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&QApplication&
2 #include&QLabel&
4 int main(int argc ,char **argv)
QApplication a(argc,argv);
QLabel *label =new QLabel("Hello world");
label-&show();
return a.exec();
2.2 智能指针代码参考(Sailfish OS)
1 #include &QApplication&
3 int main(int argc, char *argv[])
QScopedPointer&QApplication& app(new QApplication(argc, argv));
QScopedPointer&QQuickView& view(new QQuickView);
view-&setSource("/path/to/main.qml");
return app-&exec();
三、我的观点
  关于指针的使用方式和地方的选择这个确实是见仁见智的,我自己对于指针的使用是很小心的,如果使用的话也会在一些不牵扯线程安全的情况下使用,并且打印日志报告。另外一个问题就是指针的释放和重用问题,我的观点是如果在指针被释放的作用域进行delete的操作,但是并没有置为null,这个时候指针应该是还能够使用的,只是没有交还给操作系统而已,如有误解,请指正。
阅读(...) 评论()14:17 提问
写了一个Qt界面,然后现在想把做好的openinventor显示模块嵌进去
写了一个Qt界面,然后现在想把做好的openinventor显示模块嵌进去,都是基于vs2010做的,怎么办?
按赞数排序
用 SoWin classes are specific to the Microsoft Windows environment.
#include &Inventor/Qt/SoQt.h&
#include &Inventor/Qt/SoQtRenderArea.h&
#include &Inventor/nodes/SoCone.h&
#include &Inventor/nodes/SoDirectionalLight.h&
#include &Inventor/nodes/SoMaterial.h&
#include &Inventor/nodes/SoPerspectiveCamera.h&
#include &Inventor/nodes/SoSeparator.h&
int main(int, char **argv)
// Initialize Inventor. This returns a main window to use.
// If unsuccessful, exit.
QWidget *myWindow = SoQt::init(argv[0]);
// pass the app name
if (myWindow == NULL)
// Make a scene containing a red cone
SoSeparator *root = new SoS
SoPerspectiveCamera *myCamera = new SoPerspectiveC
SoMaterial *myMaterial = new SoM
root-&ref();
root-&addChild(myCamera);
root-&addChild(new SoDirectionalLight);
myMaterial-&diffuseColor.setValue(1.0, 0.0, 0.0);
root-&addChild(myMaterial);
root-&addChild(new SoCone);
// Create a render area in which to see our scene graph.
// The render area will appear within the main window.
SoQtRenderArea *myRenderArea = new SoQtRenderArea(myWindow);
// Make myCamera see everything.
myCamera-&viewAll(root, myRenderArea-&getViewportRegion());
// Put our scene in myRenderArea, change the title
myRenderArea-&setSceneGraph(root);
myRenderArea-&setTitle("Hello Cone");
myRenderArea-&show();
SoQt::show(myWindow);
// Display main window
SoQt::mainLoop();
// Main Inventor event loop
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐求几个Qt交流群的群号,最近想把qt捡起来学习一下_qt吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:38,871贴子:
求几个Qt交流群的群号,最近想把qt捡起来学习一下收藏
就偶尔用过qt,用的很肤浅,只是拉拉控件,显示一下东西什么的,想深入交流学习一些东西,毕竟很好用
看来我也要学学这个了
登录百度帐号当前位置:
&& 《英雄联盟lol》战队创建之QT简要分析攻略
相关资源:
LOL建战队怎么说我QT等级不够
你登录Qtalk看一下自己的等级是多少 要5级才能建战队的。
加入LOL战队QT号怎么升级
QT中每天最多得5分(也就是5个小时)(推荐计入101、616的房间挂机)只有挂机这个办法才能升级。去战队房间挂着 ,要会员马甲,既有贡献,又有经验,等级到了在申请入会。
LOL QT认证战队考核怎么弄
考核对象:所有认证战队考核周期:每月的1日—15日、16日—30日考核内容:战队绑定的QTalk房间平均在线注:在考核周期开启后完成认证的战队,只能参加下一周的考核。如本月1日—15日加入认证的战队,只能参加本月16日—30日的考核,本月16日—30日加入认证的战队,只能参加下月1日—15日的考核。
&&&&lol》S3总决赛OMG VS 皇族比赛全过程总结&→让你重现比赛过程!
&&&&更多请看:
《英雄联盟》相关文章

我要回帖

更多关于 qt 去掉问号 的文章

 

随机推荐