Qt 6.2C++程序设计与桌面应用开发 思政教学课件 第1、2章 初识Qt框架、Qt开发基础_第1页
Qt 6.2C++程序设计与桌面应用开发 思政教学课件 第1、2章 初识Qt框架、Qt开发基础_第2页
Qt 6.2C++程序设计与桌面应用开发 思政教学课件 第1、2章 初识Qt框架、Qt开发基础_第3页
Qt 6.2C++程序设计与桌面应用开发 思政教学课件 第1、2章 初识Qt框架、Qt开发基础_第4页
Qt 6.2C++程序设计与桌面应用开发 思政教学课件 第1、2章 初识Qt框架、Qt开发基础_第5页
已阅读5页,还剩136页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Qt6.2/C++程序设计与桌面应用开发21世纪高等学校计算机类课程创新规划教材–微课视频版教材目录第1章初识Qt框架第2章Qt开发基础第3章界面设计组件第4章主框架窗口第5章对话框设计第6章事件系统第7章文件与数据库第8章模型/视图结构第9章图形绘制第10章多媒体编程第11章网络编程第12章进程与线程教材目录第1章初识Qt框架1.1Qt简介1.2开发环境搭建1.3程序设计方式1.4项目结构分析1.1Qt简介Qt是一个基于C++面向对象程序设计语言、功能全面、跨平台的图形用户界面(GUI)应用程序框架。它提供了一种高效的、真正基于组件编程模式的应用程序设计解决方案。Qt实际上就是一套C++应用程序开发类库,与MicrosoftMFC类似。历史及应用1、发展历程Qt由挪威Trolltech(奇趣科技)公司于1991年开发,在2008年,Trolltech公司被诺基亚公司收购,Qt也因此成为诺基亚旗下的编程语言工具。2012年,芬兰的Digia公司完成对诺基亚公司Qt技术平台和知识产权的收购,Qt由此归属于Digia公司。2014年,Digia成立独立的Qt公司,专门负责Qt的开发、维护和商业推广。历史及应用2、应用实例自1995年以来,Qt逐步进入商业领域,已成为数以万计商业和开源应用程序的基础。QtC++框架一直都是商业应用程序的核心,无论是跨国公司和大型组织,如Adobe、Boeing、Google、IBM、Motorola、NASA、Skype等,还是无数小型公司和组织都在使用Qt进行各种类型应用程序的开发。历史及应用在桌面应用领域,下面这些著名的软件都用到了Qt。(1)Maya,由Autodesk公司出品的优秀三维动画制作软件。2011版开始使用Qt进行开发。(2)WPSOffice,是由金山软件股份有限公司自主研发的一款办公软件套装,可以实现办公软件最常用的文字、表格、演示,PDF阅读等多种功能。(3)VirtualBox,是运行在x86上的一款虚拟机软件,目前属于Oracle公司。运行该软件的操作系统被称为主操作系统。该软件运行时,向用户呈现一个虚拟的计算机,用户可以在这个虚拟计算机上安装一个从属操作系统。版本与特点Qt的发行版本分为商业版和开源版。商业版提供给用户进行商业软件开发,它是一个传统的商业软件,并提供协议有效期内的免费升级和技术支持服务;Qt开源版是为了开发自由而设计的开放源码软件,它提供了和商业版本基本相同的功能,在GNU通用公共许可证下免费供用户使用。经过二十多年的发展与进步,Qt的版本已经从Qt5更新到了Qt6。本教材使用Qt6.2.1LTS,它是Qt6的第1个长期支持(LTS,longtermsupported)版本。版本与特点Qt的主要特点:(1)跨平台Qt支持PC和服务器的平台,包括Windows、Linux和macOS等,还支持移动和嵌入式操作系统,如iOS、EmbeddedLinux、Android和WinRT等。跨平台意味着只需要编写一次程序,在不同平台上无需改动或只需少许改动后再编译,就可以形成在不同平台上运行的版本。这种跨平台特性为开发者提供了极大的便利。版本与特点(2)面向对象Qt的良好封装机制使得Qt的模块化程度非常高,可重用性好,对于用户开发来说是非常方便的。另外,Qt提供了一种称为signal/slot(信号/槽)的通信机制,这使得各个元件之间的协同工作变得更为简单安全。(2)丰富的API

Qt包括多达300多个C++类,除了用于用户界面开发,还可用于文件操作、数据库处理、2D/3D图形渲染、多媒体操作和网络通信等。1.2开发环境搭建Qt应用开发一般都使用集成开发环境。目前,支持Qt应用开发的集成工具有很多,其中能够跨平台使用的主要有QtCreator、QDevelop、Eclipse、MonkeyStudio和Code::Blocks等。除此之外,还有在X11平台上使用的Kdevelop,在Windows平台上使用的MicrosoftVisualStudio,以及在Mac平台上使用的Xcode等。下载与安装1、下载与Qt5版本不同的是,Qt6只能使用在线安装器进行安装。下载Qt的软件安装器有多种途径,可以到Qt的官方网站上进行下载,其网址为:https://www.qt.io/download也可以使用国内的Qt镜像网址或者一些其他的软件资源下载平台。建议使用清华大学开源软件镜像网站下载Qt的在线安装器。其网址为:/qt/official_releases/online_installers/下载与安装2、安装运行Qt软件安装器,根据向导提示输入相应的信息。注意Qt组件选择(SelectComponense)这个步骤,其界面如图所示。这是Qt安装中非常重要的一个步骤,建议优先安装Qt的基础组件,待开发过程中根据应用程序业务逻辑的实际需要,再进行有针对性的补充。另外,除了安装Qt库之外,还需要安装QtCreator等开发和设计工具。如图所示集成开发工具本教材使用QtCreator集成开发工具进行Qt应用程序的开发,版本为5.0.2。QtCreator是Qt官方推出的一款跨平台开源集成开发工具,具有界面简洁、操作方便、与Qt结合完美等特点。其界面如下图所示。菜单栏模式选择器构建套件选择器定位器输出窗格QtCreator界面编辑模式项目视图类视图代码编辑窗口QtCreator集成开发环境的设置:通过“Tools|Options”菜单命令打开的“Options”窗口来完成。如图所示QtCreator设置【例1.1】编写一个基于Qt的HelloWorld程序。程序运行后,在窗口中显示“HelloWorld”字符串,运行结果如下图所示。QtCreator应用(1)启动QtCreator开发工具,选择File|NewFileorProject菜单命令,或者单击Welcome模式中的Projects+New按钮,打开“NewProject”对话框。(2)在“NewProject”对话框中选择Application(Qt)中的QtWidgetsApplication项目模板,单击“Choose…”按钮,打开Qt应用程序创建向导。(3)设置项目名称为“examp1_1”,指定项目存放位置为“F:\chap01”

(4)选择默认的qmake项目构建系统(5)选择QWidget基类,其他使用系统默认值(6)本项目不使用其他语言(7)选择项目的构建套件,这里使用DesktopQt6.2.1MinGW64-bit(8)不向项目中添加其他子项目,也不设置版本控制。单击“Finish”按钮,完成项目(9)展开“Projects”窗口中项目名称节点下的“Forms”分组,双击该分组中的widget.ui窗体界面文件,打开QtDesigner界面设计器,对应用程序主窗口界面进行可视化设计。(10)点击窗体,设置其大小(WidthxHeight)为320x240;窗体标题(windowTitle)为“例1.1”。(11)在窗体中设置Label控件和PushButton控件,分别用来显示字符串和执行窗口关闭命令。在窗体中设置控件,直接用鼠标将控件从控件箱拖动到窗口中的适当位置即可。(12)分别点击窗体中的Label控件和PushButton控件,将其text属性分别设置为“HelloWorld”和“退出”。(13)保存文件,单击QtCreator左边栏中的Run按钮,构建并运行应用程序(14)再次打开窗体设计器,按快捷键F4将窗体的编辑状态切换成“EditSignalsandSlots”,选择“退出”按钮并拖动鼠标至窗体中,弹出“ConfigureConnection”对话框(15)保存文件,再次单击QtCreator左边栏中的“Run”按钮,运行应用程序。此时,若单击主窗口中的“退出”按钮,应用程序主窗口会随即关闭。1.3程序设计方式搭建好Qt开发环境后,就可以开始进行Qt应用程序的开发了。Qt应用程序的开发可以采用3种程序设计方式,即可视化设计方式、代码化设计方式和混合式设计方式。可视化设计1、可视化设计所谓可视化设计方式,就是应用程序框架通过向导自动生成,然后使用QtDesigner设计器进行窗体界面布局设计、Action设计,以及信号和槽的添加等操作。例如,上述例1.1应用程序的开发所采用的就是可视化设计方法。【例1.2】重新编写例1.1中的HelloWorld应用程序,将应用程序主窗口基类设置为QDialog,并使主窗口中的字符串和按钮控件均水平居中对齐。运行结果如图所示。(1)打开QtCreator开发工具,生成一个名为examp1_2的Qt应用程序,并将主窗口标题设置为“例1.2”。操作方法如例1.1所示。(2)在窗体中设置Label控件和PushButton控件,并添加3个VerticalSpacer控件,对象名称使用默认值(3)选择主窗口中的全部控件,单击工具栏中的“垂直布局管理器”图标,在主窗口中添加一个VerticalLayout控件,对象名称使用默认值,并调整其大小(4)分别选择Label控件和PushButton控件,在属性窗口中设置其text属性值分别为“HelloWorld”和“退出”,并通过右键菜单设置其水平居中对齐(5)实现“退出”按钮的单击功能。单击“SignalsandSlotsEditer”窗口中的“+”按钮,添加一个新的信号与槽。设置Sender、Signal、Receiver和Slot分别为pushButton、clicked()、Dialog和close()

(6)保存文件,单击QtCreator左边栏中的“Run”按钮,运行应用程序。单击主窗口中的“退出”按钮,主窗口随即关闭。2、代码化设计所谓代码化设计方法,就是应用程序的所有代码均手工添加完成,而不使用QtDesigner等设计工具。代码化设计【例1.3】使用手工编码的方式,完成例1.2程序功能。(1)打开QtCreator开发工具,选择“Projects”下的“OtherProject”模板中的“EmptyqmakeProject”模板,生成一个名为examp1_3的空Qt应用程序。(2)双击打开应用程序的项目文件“examp1_3.pro”,在文件中添加如下文本行,将Qt的Widgets模块加载到项目中。QT+=widgets(3)右击新生成的项目文件夹examp1_3,在弹出的快捷菜单中选择“AddNew…”菜单命令,打开“新文件”对话框。向项目中添加一个名为“main.cpp”的C++源文件。(4)双击打开main.cpp文件,在文件中添加代码,实现程序功能。创建主窗口对象,并设置其属性创建主窗口中的控件对象,并设置其属性创建主窗口的垂直布局,并设置控件信号与槽(5)单击QtCreator中的“运行”按钮,即可得到程序的运行结果。如图1.40所示。单击对话框中的“退出”按钮,即可关闭程序的主对话框。3、混合式设计使用可视化设计方法开发Qt应用程序,不需要人工编写代码去处理大量繁琐的界面组件的创建和布局管理工作,可以直观地进行界面设计,从而大大提高了应用程序开发的工作效率。但该设计方法也存在一些缺陷,如某些组件无法可视化地添加到界面上,此时就必须手工编写代码来实现相应的部件功能。采用纯代码方式进行Qt应用程序开发,能够设计出非常精美的用户界面,并且可以实现非常复杂的业务逻辑。但是设计效率太低,过程也非常的繁琐。因此,在实际的开发过程中,常常使用混合的设计方法,能够使用可视化设计的就尽可能可视化设计解决,无法可视化实现的再用纯代码的方法解决。混合式设计【例1.4】使用混合式设计方法,实现例1.2的程序功能。要求在“退出”按钮上添加菜单,当选择菜单中的“确定”命令时,关闭应用程序主窗口。如图所示。(1)打开QtCreator开发工具,生成一个名为examp1_4的Qt应用程序。将主窗口标题设置为“例1.4”,并按照例1.1的操作步骤,向主窗口中添加控件及布局管理器。这里采用可视化程序设计方法完成应用程序框架的生成与主窗口界面的设计。(2)编写代码,实现新增功能。由于在QtDesigner中不能直接将菜单放置在“退出”按钮控件上,所以必须采用代码化方式来实现相关的界面功能。(3)保存文件,构建并运行应用程序。单击“退出”按钮,弹出按钮菜单,选择“确定”菜单命令,应用程序主窗口随即关闭。1.4项目结构分析Qt应用程序一般都包含有多个文件,这些相关联的文件被组织在一起,以“项目”的形式进行统一管理。下面以例1.1创建的程序为例,简要分析一下Qt应用程序项目的文件类型、作用,以及程序的运行机制。1、项目文件组成在QtCreator中打开例1.1中的Qt项目examp1_1,切换到“Edit”模式,展开项目视图中的各个文件分组。如图所示。项目文件组成从图中可以看到,项目examp1_1包含4种类型的文件,分别是项目文件examp1_1.pro、主函数文件main.cpp、类文件widget.h/widget.cpp和界面文件widget.ui。项目文件用于项目管理,包括项目设置、使用的Qt模块、包含的文件等信息;主函数文件是实现main()函数的文件,main()函数是C++应用程序入口函数,其主要功能是创建应用程序、创建窗口、显示窗口、运行程序、启动应用程序的消息循环和事件处理;类文件包括项目中类的声明及实现文件;界面文件是使用QtDesigner进行界面设计生成的文件,它实际上就是一个XML文件,用于管理界面中的窗体、部件、信号/槽等信息。需要注意的是,Qt项目中的界面文件在项目构建后将被转换成类文件。展开项目examp1_1构建生成的文件夹build-examp1_1-Desktop_Qt_6_2_1_MinGW_64_bit-Debug,可以看到有一个名为ui_widget.h的文件,该文件就是由examp1_1.ui界面文件生成的类文件。除了上述介绍的文件之外,Qt项目中还可能有一些其他类型的文件,例如管理项目资源的资源文件、存储项目数据的文本文件或二进制文件等。需要说明一下的是,上面的项目结构分析是以examp1_1应用为例讲解的,而examp1_1是采用qmake项目构建系统构建的。其实,QtCreator集成开发工具提供了3种项目构建系统,它们是qmake、CMake和Qbs,如图1.18所示(展开Buildsystem组合框)。采用不同的项目构建系统构建的Qt项目,其项目结构是不一样的。程序运行机制2、程序运行机制Qt程序是属于C++的,它的入口主函数仍然是main()下面是examp1_1项目中main.cpp文件内容:第一步:创建一个Qt应用程序实例QApplication是Qt的标准应用程序类,它的实例a就是一个Qt应用程序对象。第二步:创建应用程序主窗口并显示Widget是继承于QWidget的派生类,QWidget是Qt的窗体类,所以Widget类的实例w就是一个Qt窗口对象。通过对象w调用其成员函数show()实现应用程序主窗口的显示。第三步:启动应用程序并开始应用程序的消息循环和事件处理通过对象a调用其成员函数exec()启动应用程序的执行,QApplication类的exec()函数会让应用程序进行消息循环,也就是将主窗口持续显示,等待用户的下一步操作。课后作业思政本章结束Qt6.2/C++程序设计与桌面应用开发21世纪高等学校计算机类课程创新规划教材–微课视频版教材目录第1章初识Qt框架第2章Qt开发基础第3章界面设计组件第4章主框架窗口第5章对话框设计第6章事件系统第7章文件与数据库第8章模型/视图结构第9章图形绘制第10章多媒体编程第11章网络编程第12章进程与线程教材目录第2章Qt开发基础2.1Qt应用概述2.2元对象系统2.3信号与槽2.4常用Qt工具类2.1Qt应用概述Qt是一个采用标准C++程序设计语言编写的、跨平台的应用程序开发类库,它对标准C++进行了扩展,引入了元对象系统、信号与槽、动态属性等一些新的特性。由于Qt对标准C++进行了扩展,因此,Qt应用程序也拥有了一些自己的特性。Qt应用特点与标准的C++应用程序相比较,Qt应用主要有如下特点:(1)使用特有的宏扩展类的功能Qt的类中常常会设置一些特有的宏,例如Q_CLASSINFO()、Q_OBJECT、Q_PROPERTY()、Q_SIGNALS和Q_SLOTS等,来实现Qt的一些扩展功能(2)使用信号与槽机制实现对象间通信信号与槽是Qt的一个核心特点,也是区别于其他框架的重要特性。信号与槽是Qt对象间进行通信的机制,在第1章的例1.1应用程序中,我们使用这种机制完成了单击“退出”按钮来关闭主窗口的操作,也就是完成了Qt的QPushBotton对象与QWidget对象间的通信。像这样对象间的通信,在VisualC++MFC框架中,则是通过“消息”映射的方式来实现的。(3)使用元对象编译器进行预处理。由于Qt对标准C++进行了扩展,增加了像信号/槽、属性系统等一些新的功能,所以在Qt应用程序中的一些代码不能直接使用标准C++编译器进行编译,需要先将其转换成标准C++兼容的形式。Qt的元对象编译器(Meta-ObjectCompiler,MOC)是一个预处理器,在源程序被编译前先将具有Qt特性的程序转换为标准C++兼容的形式,然后再由标准C++编译器进行编译与链接。(4)使用不同类型的文件实现不同的功能Qt应用程序是由多个不同类型的文件组成的,除了我们在1.4.1节中分析的项目文件(*.pro)、类文件(*.h和*.cpp)以及界面文件(*.ui)之外,还包括实现元对象系统(Meta–ObjectSystem)特性的MOC预处理文件(moc_*.h、moc_*.cpp和moc_*.o)以及对资源进行管理的资源文件(*.qrc)等。这些文件分别实现不同的功能,最后由标准C++编译器将它们编译、链接成一个整体。Qt应用功能Qt应用的功能取决于用户需求以及开发中所使用的Qt类。Qt类库中的类是以模块方式进行组织和管理的,版本不同其模块数量、各个模块中包含的类都会不一样。Qt6.2.1的模块被分成了QtEssentials(基本模块)和QtAdd-Ons(附加模块)两大类。1、基本功能Qt应用的基本功能由Qt基本模块中的类来实现,这些类在所有的开发平台和目标平台上均可使用。Qt6.2.1的基本模块及其功能描述,如下表所示。2、特定功能Qt应用的特定功能由Qt附加模块中的类来实现。Qt中的附加模块实现一些特定的目的,它们可能只针对某些开发平台,或只能用于某些操作系统,或只是为了向后兼容。Qt6.2.1的附加模块及其功能描述,如下表所示。2.2元对象系统Qt的元对象系统(Meta-ObjectSystem)提供了对象之间通信的信号与槽机制、运行时类型信息和动态属性系统。1、对象模型标准C++对象模型可以在运行时非常有效地支持对象范式(objectparadigm),但是它的静态特性在一些问题领域中不够灵活。Qt在标准C++对象模型的基础上添加了一些特性,形成了自己的对象模型。这些特性主要有:(1)一个强大的无缝对象通信机制,即信号与槽(signalsandslots);(2)可查询和可设计的对象属性系统(objectproperties);(3)强大的事件和事件过滤器(eventsandeventfilters);对象模型(4)通过上下文进行国际化的字符串翻译机制(stringtranslationforinternationalization)(5)完善的定时器(timers)驱动,使得可以在一个事件驱动的GUI中处理多个任务;(6)分层结构的、可查询的对象树(objecttrees),它使用一种很自然的方式来组织对象拥有权(objectownership);(7)守卫指针即QPointer,它在引用对象被销毁时自动将其设置为0;(8)动态的对象转换机制(dynamiccast);(9)支持自定义类型的创建Qt对象模型基础类及功能描述,如表2.3所示。2、元对象系统Qt的元对象系统以其对象模型为基础,由以下三个基础组成。(1)使用元对象系统的类必须继承于QObject类;(2)必须在类的private声明区声明Q_OBJECT宏;(3)使用MOC(Meta-ObjectCompiler,元对象编译器)为每个QObject的子类实现元对象特性提供必要的代码。元对象系统元对象系统主要是为了实现信号与槽机制而引入的,不过除了信号/槽机制以外,元对象系统还提供了其他的一些特性。例如:QObject::metaObject()函数返回类关联的元对象;)QMetaObject::className()在运行时返回类的名称字符串,而不需要通过C++编译器支持本机运行时类型信息(RTTI);QObject::inherits()函数判断一个对象是否为某个类或QObject子类的实例;等Qt提供了强大的基于元对象系统的属性系统(PropertySystem),可以在能够运行Qt应用程序的平台上支持任意的标准C++编译器。通过Qt的属性系统,不仅可以静态或动态地定义属性、设置属性值、查询属性,还可以为类定义一些其他的附加信息。属性系统1、属性的定义在一个Qt类中声明属性,要求该类必须是QObject类的派生类,并且需要通过Q_PROPERTY()宏来定义。其语法格式如下:下面是QWidget类中定义属性示例:【例2.1】编写一个非GUI的Qt应用程序,演示使用Q_PROPERTY宏定义属性的方法。要求为应用程序添加一个名为Student的QObject派生类,并在该类中定义属性name及操作函数。(1)打开QtCreator集成开发环境,创建一个非GUI的Qt应用程序,项目名称为examp2_1。(2)选择主菜单中的File|NewFileorProject…菜单命令,打开“NewFileorProject”对话框(3)选择“FilesandClasses”列表框中的“C/C++”选项,向项目中添加一个名为Student的C++类,其基类为QObject(4)打开Student类的头文件及实现文件,在其中添加阴影部分的代码。(5)打开main.cpp文件,在主函数main()中添加如下阴影部分的代码。(6)构建并运行程序。输出结果如图所示。2、属性的使用类的属性定义完成后,就可以在程序中使用该属性了。属性的使用包括属性的设置与读取等操作。在例2.1应用程序的主函数中,使用Student对象的setName()函数对name属性进行了设置,同时使用property()函数读取到了该对象的name属性值。property()函数是QObject类的成员函数,原型为:QVariantQObject::property(constchar*name)const3、动态属性当使用QObject::setProperty()函数为对象设置属性时,若该属性不存在,函数会为类定义一个新的属性,这个新属性称之为动态属性。动态属性是在运行时定义的,它只属于正在运行的类的实例。4、附加信息在Qt的属性系统中,还可以使用Q_CLASSINFO()宏来为类定义一些附加信息。该宏的语法格式如下:Q_CLASSINFO(Name,Value)其中,Name表示信息名称,Value表示信息内容。例如:Q_CLASSINFO(“author”,”mashian”)Q_CLASSINFO(“version”,”1.0.1”)【例2.2】编写一个Qt应用程序,在程序主窗口中显示自定义类的对象属性信息,以及自定义类的类信息。运行结果如图所示。(1)打开QtCreator集成开发环境,创建一个基于QWidget的Qt应用程序,项目名称为examp2_2。(2)使用例2.1中相同的方法,为项目添加一个名为Student的新类。如图2.5所示。为了覆盖更多的知识点,这里没有使用例2.1中的Student类。(3)双击项目中的widget.ui界面文件,打开界面设计器。在项目主窗口中添加一个名为plainTextEdit的QPlainTextEdit类部件,用于显示Student类的相关信息。如图所示。(4)打开项目文件widget.h,为Widget类添加一个私有的Student对象指针student和成员函数getInfo()的声明。代码如下阴影部分所示。(5)打开项目文件widget.cpp,在Widget类的构造函数中添加代码,并实现成员函数getInfo()的功能。代码如下阴影部分所示。2.3信号与槽信号与槽机制是Qt的核心机制,通过这种机制能够在应用程序中实现对象之间的通信。该通信机制是Qt对标准C++的扩展,需要由Qt的元对象系统支持才能实现。概述1、概述Qt的信号与槽通信机制类似于Windows操作系统中的消息处理机制,但消息处理机制是基于回调函数的;而在Qt中,使用信号和槽来代替函数指针,从而使应用程序更加安全与简洁。在应用程序设计过程中,当改变了一个对象的状态时,总希望其他对象(或自己)也能及时了解到这种状态的变化,并做出相应的响应。在Qt编程中,这种对象间的通信就是采用信号与槽机制来实现的。Qt的信号与槽通信机制能够完成任意两个Qt对象之间的通信,其中,信号会在某个特定的情况或动作下被触发,槽是等同于接收并处理信号的函数。在Qt中,每个对象都包含若干个预定义的信号和槽,当某一个特定事件发生时,一个信号被发送,与信号相关联的槽则会响应信号并完成相应的处理。当一个类被继承时,该类的信号和槽也同时被继承。当然,也可以根据需要自定义信号和槽。信号2、信号信号(signal)就是在特定情况下被发射(emit)的事件例如:例1.1中使用的clicked()信号,就是QPushBotton按钮被单击时发射的“单击”事件;例2.1中使用的nameChanged()信号是Student对象的属性值发生变化时发射的“值变化”事件。在Qt中,信号通过关键字signals和信号函数在类的头文件中声明。如例2.1中的程序代码:signals:voidnameChanged(QString);这里,signals是Qt的关键字,而非C++的关键字,它指出从此处进入了信号声明区;信号函数nameChanged()定义了信号nameChanged,该信号在发射时会附带一个QString类型的参数。信号函数中的参数,就是对象之间通信时交换的数据槽3、槽槽(slot)就是对信号响应的函数。槽函数和普通的C++成员函数一样,可以定义在类的任何区域(public、private或protected),可以具有任何参数,也可以被直接调用。不同的是,槽函数可以与一个或多个信号进行关联。当与其关联的信号被发送时,这个槽就会被调用。槽可以有参数,但槽的参数不能有默认值。在Qt类的头文件中,使用Qt的关键字slots标识槽函数的声明区。例如,例2.1中的程序代码:publicslots:voidisNameChanged(QString);就是槽函数的声明。Qt的槽就是一个普通的类成员函数,除了在类的头文件中声明之外,还需要在类的实现文件中编写其实现代码。关联在Qt的信号与槽通信机制中,对象只负责发送信号,它并不知道另一端是谁在接收这个信号;另外,一个槽也不知道是否有任何信号与自己相连接。将对象的信号与槽相关联,是实现对象间通信的关键。将信号与槽进行关联,可以采用一对一、一对多或者多对一的形式,也可以将一个信号关联到另外一个信号上。如图2.7所示。在Qt中,信号与槽的关联可以采用手动的方式,也可以采用自动的方式。1、手动关联信号与槽的手动关联通过调用QObject::connect()函数来实现。该函数原型如下:[static]QMetaObject::ConnectionQObject::connect(constQObject*sender,constchar*signal,constQObject*receiver,constchar*method,Qt::ConnectionTypetype=Qt::AutoConnection)其中:参数sender和receiver都是指向QObject(或其子类)对象的指针,前者指向发送信号的对象,后者指向处理信号的对象,两者分别被称为“发送者”和“接收者”;参数signal

和method

都是字符指针,分别指向信号函数和槽函数;参数type是一个Qt::ConnectionType枚举类型值,表示信号与槽之间的关联方式connect()函数的简略格式:connect(sender,SIGNAL(signal_function()),receiver,SLOT(slot_function()))其中,signal_function()和slot_function()分别表示sender对象中定义的信号函数和receiver对象中定义的槽函数。例如,例1.4程序中的语句:connect(ok,SIGNAL(triggered()),this,SLOT(close()));QObject类的connect()函数是一个重载函数,在Qt1的帮助文档中可以查询到它的6种参数形式。例如下面的格式:[static]QMetaObject::ConnectionQObject::connect(constQObject*sender,constQMetaMethod&signal,constQObject*receiver,constQMetaMethod&method,Qt::ConnectionTypetype=Qt::AutoConnection)给出的原型声明中,使用函数指针signal和method来指向信号函数和槽函数。【例2.3】编写一个Qt应用程序,在主窗口中模拟学生与老师的交流过程。如图2.8所示,学生和老师分别在界面左、右侧底部的文本编辑框中发送信息。(1)打开QtCreator集成开发环境,创建一个基于QWidget的Qt应用程序,项目名称为examp2_3。(2)双击项目中的widget.ui界面文件,打开界面设计器。首先,将主窗口大小设置为400x200,标题设置为“例2.3”;然后,在主窗口中放置2个“LineEdit”部件和2个“PlainTextEdit”部件,对象名称分别为sLineEdit、tLineEdit和sPlainTextEdit、tPlainTextEdit(3)打开Widget类的头文件widget.h,声明2个槽函数。代码如下:(4)打开Widget类的实现文件widget.cpp,添加槽函数实现代码,并关联信号与槽。代码如下:(5)构建并运行程序。结果如图2.8所示。这里使用connect()函数将信号与槽进行手动关联,信号和槽的设置采用了Qt的SIGNAL宏和SLOT宏也可以采用函数指针的参数形式来设置信号和槽,如下所示:2、自动关联信号与槽的自动关联是指不需要手动使用connect()函数,而是通过自动命名槽函数的方式来实现信号与槽的关联。在使用信号与槽的自动关联方式时,槽函数的命名是关键。槽函数的原型格式为:voidon_<objectName>_<signalName>(<signalParameters>);其中,objectName表示发送信号的对象指针;signalName

表示信号名;signalParameters

表示发送信号时可能带有的参数。信号与槽的自动关联通过元对象系统来实现,实际上就是使用QMetaObject::connectSlotsByName()函数来代替QObject::connect()函数。该函数原型如下:[static]voidQMetaObject::connectSlotsByName(QObject*object)其中,参数object为QObject类或其子类的对象指针。【例2.4】编写一个与例2.3功能相同的Qt应用程序,使用自动关联方式连接相关的信号与槽。(1)打开QtCreator集成开发环境,创建一个基于QWidget的Qt应用程序,项目名称为examp2_4。(2)打开界面设计器设计程序主窗口界面。如图2.9所示。(3)右击界面中的单行文本输入框部件,在弹出的快捷菜单中选择“Gotoslot…”菜单命令,如图2.10所示;在接下来的“Selectsignal”对话框中选择“editingFinished”信号,如图2.11所示。(4)单击图2.11中的“OK”按钮,QtCreator为应用程序的Widget类添加一个名为“on_sLineEdit_editingFinished()”的槽函数。如图2.12所示。(5)用与上述(3)、(4)步骤中相同的方法,为应用程序主窗口中的另一个单行文本输入框部件添加槽函数。自动添加的槽函数名称为“on_tLineEdit_editingFinished()”。(6)将例2.3应用程序的槽函数studentMessage()、teacherMessage()中的代码复制到新添加的2个槽函数中。构建并运行程序,得到与例2.3应用程序相同结果。2.4常用Qt工具类在Qt应用开发中,除了用于GUI界面设计的部件类之外,还需要使用一些工具类,例如Qt的字符串类、容器类,以及QVariant数据类等。字符串类1、字符串类标准C++提供了两种字符串,一种是C语言风格的以“\0”字符结尾的字符数组;另一种是字符串类String。在Qt中,使用QString类的对象来表示字符串。Qstring

使用Unicode编码来存储字符串,每一个字符都是一个16位的QChar,而不是8位的char。1、创建对象使用QString类的构造方法创建Qt的字符串对象。例如:使用赋值运行符(=或+=)重载函数通过赋值的方式来初始化字符串。例如:2、常用操作在QString类中定义了很多不同功能的成员函数,使用这些函数可以对Qt中的字符串进行处理。QString类的部分成员函数及功能如表2.8所示。3、转换操作在QString类中定义了一些成员函数,通过这些成员函数可以将字符串转换为数值,也可以将数值字符串转换为不同的进制,还可以对字符串编码、输出格式等进行转换。表2.9给出了QString类中常用的转换函数。4、查询操作在QString类中定义了一些成员函数,通过这些成员函数可以实现定位字符、提取子串、替换字符等相关操作。表2.10给出了QString类中部分常用的查询相关操作函数。5、比较操作在Qt中,字符串的比较操作是通过QString类提

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论