您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 数据通信与网络 > QT框架的C++编程
一、Qt概述1、关于QtQt是Trolltech公司的一个产品。Qt是一个多平台的C++图形用户界面应用程序框架。它提供给应用程序开发者建立图形用户界面应用程序所需的所有功能。Qt是完全面向对象的,它很容易扩展,并且允许真正的组件编程。自从1996年早些时候,Qt进入商业领域,它已经成为全世界范围内数千种成功的应用程序的基础。Qt也是流行的Linux桌面环境KDE的基础。(KDE是所有主要的Linux发行版的一个标准组件)Qt支持下述平台:MS/Windows-95、98、NT4.0、ME、和2000Unix/X11-Linux、SunSolaris、HP-UX、CompaqTru64UNIX、IBMAIX、SGIIRIX和其它很多X11平台Macintosh-MacOSXEmbedded-有帧缓冲(framebuffer)支持的Linux平台。2、Qt版本信息Qt被按不同的版本发行:Qt企业版和Qt专业版:提供给商业软件开发。它们提供传统商业软件发行版并且提供免费升级和技术支持服务。企业版比专业版多一些扩展模块。Qt自由版:是Qt仅仅为了开发自由和开放源码软件提供的Unix/X11版本。在Q公共许可证和GNU通用公共许可证下,它是免费的。Qt/嵌入式自由版:是Qt为了开发自由软件提供的嵌入式版本。在GNU通用公共许可证下,它是免费的。下表是关于Qt在Windows环境下各个版本的区别。(Qt为Windows只提供了专业版和企业版,不过自由版本的Qt仍然可以在Windows环境下使用)组成模块自由版专业版企业版Qt的基本模块(工具、核心、窗口部件、对话框)与平台无关的Qt图形用户界面工具包和应用类XXXQt设计器可视化的Qt图形用户界面的生成器XXX图标视图模块几套图形用户交互操作的可视化效果。XX工作区模块多文档界面(MDI)支持XXOpenGL三维图形模块在Qt中集成了OpenGLX网络模块一些套接字,TCP,FTP和异步DNS查询并与平台无关的类X画布模块为可视化效果,图表和其它而优化的二维图形领域X表格模块灵活的,可编辑的表格/电子表格XXML模块通过SAX接口和DOMLevel1的XML解析器XSQL模块SQL数据库访问类X3、Qt的组成Qt提供了一组范围相当广泛的C++类库,并包含了几种命令行和图形界面的工具,有效地使用这些工具可以加速开发过程。QtDesigner:Qt设计器。用来可视化地设计应用程序界面。QtLinguist:Qt语言学家。用来翻译应用程序。以此提供对多种语言的支持。Qmake:使用此工具可以由简单的、与平台无关的工程文件来生成编译所需的Makefile。QtAssistant:关于Qt的帮助文件。类似于MSDN。可以快速地发现你所需要的帮助。moc:元对象编译器。uic:用户界面编译器。在程序编译时被自动调用,通过ui_*.h文件生成应用程序界面。qembed:转换数据,比如,将图片转换为C++代码。4、Qt的安装安装的过程对于不同的Qt平台是不同的。在Windows环境下安装Qt,需要先安装MinGW。MinGW,即MinimalistGNUForWindows。它是一些头文件和端口库的集合,该集合允许人们在没有第三方动态链接库的情况下使用GCC(GNUCompilerC)产生Windows32程序。在基本层,MinGW是一组包含文件和端口库,其功能是允许控制台模式的程序使用微软的标准C运行时间库(MSVCRT.DLL),该库在所有的NTOS上有效,在所有的Windows95发行版以上的WindowsOS有效,使用基本运行时间,你可以使用GCC写控制台模式的符合美国标准化组织(ANSI)程序,可以使用微软提供的C运行时间扩展。该功能是Windows32API不具备的。下一个组成部分是w32api包,它是一组可以使用Windows32API的包含文件和端口库。与基本运行时间相结合,就可以有充分的权利既使用CRT(CRuntime)又使用Windows32API功能。实际上MinGW并不是一个C/C++编译器,而是一套GNU工具集合。除开GCC(GNU编译器集合)以外,MinGW还包含有一些其他的GNU程序开发工具(比如gawkbison等等)。在安装MinGW之后,再安装Qt,然后更改一下Windows系统的环境变量,就可以在Windows环境下使用Qt了。如果想在VC环境下使用Qt,那么还需要进一步编译和设置,或者下载专门用于VC的QT版本。有关此方面的信息请参考附录。二、开始学习Qt1、Hello,Qt!我们以一个非常简单的Qt程序开始Qt的学习。我们首先一行行的分析代码,然后我们将会看到怎样编译和运行这个程序。1#includeQApplication2#includeQLabel3intmain(intargc,char*argv[])4{5QApplicationapp(argc,argv);6QLabel*label=newQLabel(HelloQt!);7label-show();8returnapp.exec();9}第1行和第2行包含了两个类的定义:QApplication和QLabel。对于每一个Qt的类,都会有一个同名的头文件,头文件里包含了这个类的定义。因此,你如果在程序中使用了一个类的对象,那么在程序中就必须包括这个头文件。第3行是程序的入口。几乎在使用Qt的所有情况下,main()函数只需要在把控制权转交给Qt库之前执行一些初始化,然后Qt库通过事件来向程序告知用户的行为。argc是命令行变量的数量,argv是命令行变量的数组。这是一个C/C++特征。它不是Qt专有的,无论如何Qt需要处理这些变量第5行定义了一个QApplication对象App。QApplication管理了各种各样的应用程序的广泛资源,比如默认的字体和光标。App的创建需要argc和argv是因为Qt支持一些自己的命令行参数。在每一个使用Qt的应用程序中都必须使用一个QApplication对象,并且在任何Qt的窗口系统部件被使用之前创建此对象是必须的。App在这里被创建并且处理后面的命令行变量(比如在X窗口下的-display)。请注意,所有被Qt识别的命令行参数都会从argv中被移除(并且argc也因此而减少)。第6行创建了一个QLabel窗口部件(widget),用来显示“Hello,Qt!”。在Qt和Unix的术语中,一个窗口部件就是用户界面中一个可见的元素,它相当于Windows术语中的“容器”加上“控制器”。按钮(Button)、菜单(menu)、滚动条(scrollbars)和框架(frame)都是窗口部件的例子。窗口部件可以包含其它的窗口部件。例如,一个应用程序界面通常就是一个包含了QMenuBar,一些QToolBar,一个QStatusBar和其它的一些部件的窗口。绝大多数应用程序使用一个QMainWindow或者一个QDialog作为程序界面,但是Qt允许任何窗口部件成为窗口。在这个例子中,QLabel窗口部件就是作为应用程序主窗口的。第7行使我们创建的QLabel可见。当窗口部件被创建的时候,它总是隐藏的,必须调用show()来使它可见。通过这个特点我们可以在显示这些窗口部件之前定制它们,这样就不会出现闪烁的情况。第8行就是main()将控制权交给Qt。在这里,程序进入了事件循环。事件循环是一种stand-by的模式,程序会等待用户的动作(比如按下鼠标或者是键盘)。用户的动作将会产生程序可以做出反应的事件(也被称为“消息”)。程序对这些事件的反应通常是执行一个或几个函数。为了简单起见,我们没有在main()函数的结尾处调用delete来删除QLabel对象。这种内存泄露是无害的,因为像这样的小程序,在结束时操作系统将会释放程序占用的内存堆。下面我们来编译这个程序。建立一个名为hello的目录,在目录下建立一个名为hello.cpp的c++源文件,将上面的代码写入文件中。运行“开始程序QtbyTrolltechQtCommandPrompt”。在命令行模式下,切换目录到hello下,然后输入命令:qmake–project。这个命令将产生一个依赖于工作平台的工程文件(hello.pro)。再输入命令:qmakehello.pro。这个命令通过工程文件产生一个可以在特定工作平台上使用的makefile。最后输入命令:make来产生应用程序。运行这个程序,可以得到如下的程序界面。Qt也支持XML。我们可以把程序的第6行替换成下面的语句:QLabel*label=newQLabel(h2iHello/ifontcolor=redQt!/font/h2);重新编译程序,我们发现界面拥有了简单的HTML风格。如下图:2、调用退出第二个例子展示了如何使应用程序对用户的动作进行响应。这个应用程序包括了一个按钮,用户可以点击这个按钮来退出程序。程序代码与上一个程序非常相似,不同之处在于我们使用了一个QPushButton来代替QLabel作为我们的主窗口,并且我们将一个用户动作(点击一个按钮)和一些程序代码连接起来。1#includeQApplication2#includeQPushButton3intmain(intargc,char*argv[])4{5QApplicationapp(argc,argv);6QPushButton*button=newQPushButton(Quit);7QObject::connect(button,SIGNAL(clicked()),8&app,SLOT(quit()));9button-show();10returnapp.exec();11}Qt程序的窗口部件发射信号(signals)来指出一个用户的动作或者是状态的变化。在这个例子中,当用户点击这个按钮的时候,QPushButton就会发射一个信号——clicked()。一个信号可以和一个函数(在这种情况下我们把这个函数叫做“槽(slot)”)相连,当信号被发射的时候,和信号相连的槽就会自动执行。在这个例子中,我们把按钮的信号“clicked()”和一个QApplication对象的槽“quit()”相连。当按钮被按下的时候,这个程序就退出了。3、窗口布局在本小节,我们将用一个样例来展现如何在窗口中规划各个部件的布局,并学习使用信号和槽来使两个窗口部件同步。这个应用程序要求输入用户的年龄,使用者可以通过一个旋转窗口或者一个滑块窗口来输入。这个应用程序包括三个窗口部件:一个QSpinBox,一个QSlider和一个QWidget。窗口部件QWidget是程序的主窗口。QSpinBox和QSlider被放置在QWidget中;他们是QWidget的子窗口。当然,我们也可以说QWidget是QSpinBox和QSlider的父窗口。QWidget本身没有父窗口,因为它被当作一个顶级的窗口。QWidget以及所有它的子类的构造函数都拥有一个参数:QWidget*,这说明了它的父窗口。下面是程序的代码:1#includeQApplication2#includeQHBoxLayout3#includeQSlider4#includeQSpinBox5intmain(intargc,char*argv[])6{7QApplicationapp(argc,argv);8QWidget*window=newQWidget;9window-setWindowTitle(EnterYourAge);10QSpinBox*spinBox=newQSpinBox;11QSlider*slider=newQSlider(Qt::Horizontal);12spinBox-setRange(0,130);13slider-setRange(0,130);14QObject::connect(spinBox,SIGNAL(valu
本文标题:QT框架的C++编程
链接地址:https://www.777doc.com/doc-5011497 .html