




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
QT5开发及实例(第5版)第1章Qt概述——什么是Qt01Qt的产生和发展Qt的产生和发展2008年,诺基亚公司从奇趣收购了Qt,并从2009年5月发布的Qt4.5起开放源代码。2011年,Digia公司(芬兰的一家IT服务公司)从诺基亚收购了Qt的商业版权。2012年8月9日,诺基亚宣布将Qt软件业务正式出售给Digia。2013年7月3日,Digia公司发布Qt5.1并于次年4月配套推出了Qt跨平台的集成开发环境QtCreator3.1.0。2014年9月16日,Digia成立了一个名为TheQtCompany的全资子公司,以进一步推动Qt产品的开发和市场扩张,并建立起全新的Qt产品网站www.qt.io,该网站将Qt的商业业务和开源社区统一到同一个在线渠道之中。02Qt5.15与Qt6Qt5.15与Qt6随着互联网迈入“云”时代及物联网的兴起,TheQtCompany紧跟潮流于2020年底发布了面向未来生产力平台的Qt6。因Digia志在同时成为桌面、嵌入式、移动互联网等众多领域的开拓者,对Qt6进行了“大刀阔斧”的重构,将原Qt5的大量传统模块和库从Qt中剔除,从零开始基于最新的技术重新研发它们的替代品,并制定了雄心勃勃的计划,但是这么一来却使得原来基于Qt5开发的很多软件功能在Qt6上暂时无法实现(因官方与之对应的新技术模块/库尚未来得及做出来),为保持兼容和维护Qt生态圈的稳定,官方在发布Qt6的同时也推出了Qt5.15,它是一个长支持(LTS)版本,可看作是Qt5系列的“封笔之作”。QT5开发及实例(第5版)第1章Qt概述——Qt5.15的安装01下载Qt在线安装器和申请免费账号下载Qt在线安装器和申请免费账号访问Qt官网https://www.qt.io,点主页右上角
按钮进入“GetQt&QA”页,找到“TryQtFrameworkandTools”版块,如图1.1所示,单击“DownloadQt”按钮,弹出Qt申请免费账号页,如图1.2所示。下载Qt在线安装器和申请免费账号图1.2申请免费账号下载Qt在线安装器和申请免费账号根据页面栏目填写信息,填写完单击底部“Submit”按钮,如果填写的信息形式上没问题,系统首先向用户提供的电话(笔者的是+8617714319***)发6位短信,在随后出现的验证对话框输入短信验证码,验证通过后,输入账号密码和对密码再次输入确认,系统会给用户提供的电子邮箱发送邮件。完成后显示页面如图。下载Qt在线安装器和申请免费账号该页面包含两个方面信息:(1)提供在线安装器下载。单击“here”超链接,系统自动识别当前操作者使用的计算机操作系统,并提供与之匹配的安装器,用户直接确认下载即可。(2)提示用户根据Qt官方发送的邮件链接尽快登录验证,因为该链接有时效,使用后不能再用。进入该链接网页,如图完成Qt账号登录。
02安装过程安装过程安装前要确保计算机是处于联网状态。(1)双击下载的安装器文件,启动向导,出现如图界面,要求输入Qt账号(也就是刚刚申请的免费账号),输入完单击“下一步”按钮。(2)接下来出现“开源义务”页,勾选“我已阅读并同意使用开源Qt的条款和条件”和“我是个人用户,我不为任何公司使用Qt”,单击“下一步”按钮。安装过程(3)在“安装程序-Qt”页直接单击“下一步”按钮。安装器自动获取远程Qt安装所需的元信息,进入“ContributetoQtDevelopment”页显示提示信息,用户可选择向Qt官方发送(或不发送)有关自己Qt使用的统计信息。单击“下一步”按钮。(4)在“安装文件夹”页显示如图。安装过程(5)在“选择组件”页选择要安装的组件,如图。因为要安装的是Qt5.15,我们在界面中央区树状视图的“Qt”节点下找到“Qt5.15.2”项,展开,看到其包含的所有组件,只须选择其中的部分进行安装。安装过程再选择其他模块,有几个模块在本书实例开发中可能会用到,所以建议大家在此一并选择装上,如图是笔者安装Qt5.15时的勾选项,供参考。(6)在“许可协议”页,选中“Ihavereadandagreetothetermscontainedinthelicenseagreements.”接受许可协议,单击“下一步”按钮。(7)在“开始菜单快捷方式”页可命名Qt启动菜单名,这里保持默认名,单击“下一步”按钮。(8)在“准备安装”页显示需要的磁盘空间,点“安装”按钮,开始在线安装Qt5.15。安装过程安装完成的界面如图,单击“完成”按钮结束安装。系统会自行启动QtCreator。03运行QtCreator运行QtCreatorQtCreator启动后进入初始界面,如图。04Qt5.15开发环境Qt5.15开发环境在Qt程序开发过程中,可以通过Qt的GUI界面设计器(QtDesigner)进行程序界面的绘制和布局,QtDesigner设计环境如图。Qt5.15开发环境
对象检查器(ObjectInspector):以两列表格的形式列出窗体中每个控件的对象名及所属类。初始窗体上尚未放置任何控件时,仅有窗体自身的一个条目,可看到它的类型为QDialog(对话框)。
属性编辑器(PropertyEditor):以两列表格的形式显示当前窗体或其上被选中控件的属性和值,可根据设计需要在其中修改属性值。
Action编辑器(ActionEditor):用于编辑菜单/工具栏的选项动作。
信号和槽编辑器(SignalsandSlotsEditor):列出了窗体界面上所有的信号/槽关联。Qt5.15开发环境设计区窗体的顶部有一系列工具按钮可用于在设计界面时切换编辑模式,Qt支持四种编辑模式,如图。Qt5.15开发环境各模式的用途简介如下。
编辑控件(EditWidgets):这是默认的模式,可以在窗体上拖曳放置控件并设置它们的属性和外观。
编辑信号/槽(EditSignals/Slots):此模式下可以为窗体上的控件关联系统中已有的信号和槽。
编辑伙伴(EditBuddies):可以建立QLabel标签与其他类型控件的伙伴关系,即当用户激活标签的快捷键时,鼠标/键盘的焦点会转移到它的伙伴控件上。Qt中只有QLabel标签对象才可以有伙伴控件,也只有该QLabel对象具有快捷键(在显示文本的某个字符前面添加一个前缀“&”就可以定义快捷键)时,伙伴关系才有效。例如:QLineEdit*leAge=newQLineEdit(this);QLabel*lbAge=newQLabel("&Age",this);lbAge->setBuddy(leAge);
编辑Tab顺序(EditTabOrder):可以设置Tab键在窗体控件间的焦点顺序。QT5开发及实例(第5版)第1章Qt概述——Qt5开发入门实例Qt5开发入门实例当用户输入一个圆的半径后,可以显示计算后的圆周长和面积值,运行效果如图。01设计器QtDesigner开发实例1.创建Qt项目2.界面设计3.认识程序启动入口4.关联信号与槽5.功能开发设计器QtDesigner开发实例【例】(简单)(CH101)采用设计器QtDesigner实现计算圆面积,完成上图所示的功能。首先创建Qt项目,接着进行界面设计,然后编写相应的功能代码。1.创建Qt项目(1)运行QtCreator,在欢迎界面左侧点“CreateProject...”按钮,或者选择“文件”→“NewProject...”命令,创建一个新的项目,出现“NewProject”窗口,如图。设计器QtDesigner开发实例(2)选择一个项目模板。点左栏“Projects”列表下的“Application(Qt)”,中间栏选“QtWidgetsApplication”选项,单击右下角“Choose...”按钮,进入下一步。(3)命名自己的项目并选择保存路径。项目命名没有大小写要求,依个人习惯,这里将项目命名为CircleCal。注意:保存项目的路径中不能有中文字符。如图所示,单击“下一步”按钮进入下一步骤。设计器QtDesigner开发实例(4)接下来的界面让用户选择项目的构建(编译)工具,这里选qmake,如图所示,单击“下一步”按钮。设计器QtDesigner开发实例(5)在“ClassInformation”页根据实际需要选择一个“基类”。这里选择QDialog对话框类作为基类,“Classname”(类名)填写Dialog,这时“Headerfile”(头文件)、“Sourcefile”(源文件)及“Formfile”(界面文件)都出现默认的文件名dialog,但建议读者根据项目程序功能改名,这里将3个文件都重命名为circleCal。默认选中“Generateform”(创建界面)复选框,表示需要采用设计器QtDesigner来可视化地设计界面,如图所示,单击“下一步”按钮。设计器QtDesigner开发实例(6)再次单击“下一步”按钮,进入“KitSelection”(选择构建套件)界面,由于之前安装选择组件的时候已经指定了使用唯一的编译器MinGW,故这里只有一个选项“DesktopQt5.15.2MinGW64-bit”,如图,直接单击“下一步”按钮进入下一步骤即可。设计器QtDesigner开发实例(7)此时,相应的文件已经自动加载到项目文件列表中,如图。设计器QtDesigner开发实例QtCreator界面左上方出现项目结构的树形视图,项目的所有文件自动在视图中分类显示,如图1.20(a)所示,各文件包含在相应的节点中,单击节点前的“”图标可以显示该节点下的文件;而单击节点前的“”图标则可隐藏该节点下的文件。单击上部灰色工具栏中的过滤符号后,弹出一个下拉列表,勾选“简化树形视图”则切换到简单的文件列表样式,如图1.20(b)所示。
设计器QtDesigner开发实例2.界面设计拖曳左侧组件箱的滑动条,在最后的DisplayWidgets容器栏(如图1)中找到Label标签控件,拖曳三个此控件到中央设计区的窗体上;同样,在InputWidgets容器栏(如图2)中找到LineEdit单行文本框控件,也拖曳三个到窗体上,用于输入半径值及显示计算结果;在Buttons容器栏(如图3)中找到PushButton按钮控件,拖曳一个到窗体上。
设计器QtDesigner开发实例设置窗体上各控件的属性。分别选中要设置属性的控件,根据表1.1在设计环境右下方的属性编辑器中进行设置。编号控件类别对象名称属性说明
DialogDialoggeometry:[(0,0),350x200]windowTitle:计算圆面积①Labellabelgeometry:[(80,40),71x21]text:半径=②Labellabel_2geometry:[(80,80),71x21]text:周长=③Labellabel_3geometry:[(80,120),71x21]text:面积=④LineEditleRadiusgeometry:[(140,40),113x21]⑤LineEditleLengthenabled:取消勾选,表示本文本框不可输入geometry:[(140,80),113x21]⑥LineEditleAreaenabled:取消勾选,表示本文本框不可输入geometry:[(140,120),113x21]⑦PushButtonpbCalgeometry:[(140,160),93x28]text:计算设计器QtDesigner开发实例设计区窗体呈现的效果如图。此时从对象检查器可看到窗体中各控件对象的名称及所属的类,如图。设计器QtDesigner开发实例3.认识程序启动入口在开发功能之前,先来简单认识一下Qt程序的启动入口。每个Qt项目都有一个最初执行的入口函数,在项目树形视图的“Sources”节点下找到main.cpp文件,其中的main()函数就是整个项目程序的启动入口,如下:#include"circleCal.h" //(a)
#include<QApplication> //(b)
intmain(intargc,char*argv[]) //(c){QApplicationa(argc,argv); //(d)Dialogw; //创建一个对话框对象w.show(); //(e)returna.exec(); //(f)}设计器QtDesigner开发实例4.关联信号与槽(1)添加槽右击对象检查器中的“Dialog”对象,弹出快捷菜单选择“改变信号/槽...”,弹出“Dialog的信号/槽”对话框,点上部“槽”列表左下角的按钮,列表中出现一可编辑条目,输入槽calCircle(),点“确定”按钮,如图。设计器QtDesigner开发实例(2)进入“信号/槽”编辑模式点设计区窗体顶部的(编辑信号/槽)按钮或选择主菜单“编辑”→“EditSignals/Slots”。(3)按钮clicked信号连接槽移动鼠标指针到“计算”(pbCal)按钮上,按钮周边出现红色边框,按下左键拖曳,从按钮上拉出一条接地线,如图。设计器QtDesigner开发实例(4)文本框returnPressed信号连接槽操作类同第(3)步,拖曳半径文本框(leRadius)接地,在弹出“配置连接”对话框中分别选中文本框的returnPressed信号与窗体的calCircle()槽,点“确定”按钮。以上两个信号与槽关联好的界面如图。设计器QtDesigner开发实例5.功能开发首先,在circleCal.h中声明槽函数calCircle()(加黑处),如下:#ifndefDIALOG_H#defineDIALOG_H
#include<QDialog>
QT_BEGIN_NAMESPACEnamespaceUi{classDialog;}QT_END_NAMESPACE
classDialog:publicQDialog{Q_OBJECT //(a)
public:Dialog(QWidget*parent=nullptr);~Dialog();
privateslots:
voidcalCircle(); //(b)
private:Ui::Dialog*ui; //(c)};#endif//DIALOG_H在circleCal.cpp中编写槽函数calCircle()的实现代码(加黑段),如下。02直接代码开发实例1.创建Qt项目2.代码定义界面3.关联信号与槽4.功能开发直接代码开发实例【例】(简单)
(CH102)采用编写代码的方式来实现计算圆面积的功能。实现步骤如下。1.创建Qt项目创建过程同上节设计器QtDesigner开发实例,只是第(5)步在“ClassInformation”页取消“Generateform”(创建界面)复选框的选中状态,这样创建的Qt项目树形视图中将不包含“Forms”节点及其下的circleCal.ui文件,故无法进入QtDesigner设计环境,只能用代码来定义界面。2.代码定义界面首先,在项目circleCal.h中添加如下加黑代码。然后,在circleCal.cpp中编写initUi()函数,以代码构建程序界面。直接代码开发实例3.关联信号与槽本例在创建半径输入文本框和“计算”命令按钮的代码后面,都用语句设置了信号与槽的关联,如下:leRadius=newQLineEdit(this); //创建半径输入文本框leRadius->setGeometry(140,40,113,21);connect(leRadius,SIGNAL(returnPressed()),this,SLOT(calCircle()));......pbCal=newQPushButton("计算",this); //创建“计算”命令按钮pbCal->setGeometry(140,160,93,28);connect(pbCal,SIGNAL(clicked()),this,SLOT(calCircle()));在用代码构建界面时,为使控件能响应用户操作,必须用程序语句设置信号(控件接受的事件)与槽(功能函数)之间的关联。信号与槽是Qt的核心机制,当信号发出时,与之连接的槽就会自动执行,设置信号槽关联的语句一般形式为:connect(控件1,SIGNAL(信号1),控件2,SLOT(槽2/信号2));直接代码开发实例4.功能开发最后,在circleCal.cpp中编写实现圆面积计算的槽函数calCircle,代码如下:voidDialog::calCircle(){boolok;QStringvalue=leRadius->text();intr=value.toInt(&ok);if(r>=0){floatlength=2*3.14159*r;doublearea=3.14159*r*r;leLength->setText(QString::number(length));leArea->setText(QString::number(area));}}QT5开发及实例(第5版)第2章Qt5模板库、工具类及控件——字符串类01操作字符串操作字符串(1)QString提供了一个二元的“+”操作符用于组合两个字符串,并提供了一个“+=”操作符用于将一个字符串追加到另一个字符串的末尾,例如:QStringstr1="Welcome";str1=str1+"toyou!"; //str1="Welcometoyou!"QStringstr2="Hello,";str2+="World!"; //str2="Hello,World!"其中,QStringstr1="Welcome"传递给QString一个constchar*类型的ASCII字符串“Welcome”,它被解释为一个典型的以“\0”结尾的C类型字符串。这将会导致调用QString构造函数,来初始化一个QString字符串。其构造函数原型为:QT_ASCII_CAST_WARN_CONSTRUCTORQString::QString(constchar*str)被传递的constchar*类型的指针又将被QString::fromAscii()函数转换为Unicode编码。操作字符串(2)QString::append()函数具有与“+=”操作符同样的功能,实现在一个字符串的末尾追加另一个字符串,例如:QStringstr1="Welcome";QStringstr2="to";str1.append(str2); //str1="Welcometo"str1.append("you!"); //str1="Welcometoyou!"(3)组合字符串的另一个函数是QString::sprintf(),此函数支持的格式定义符和C++库中的函数sprintf()定义的一样。例如:QStringstr;str.sprintf("%s","Welcome"); //str="Welcome"str.sprintf("%s","toyou!"); //str="toyou!"str.sprintf("%s%s","Welcome","toyou!"); //str="Welcometoyou!"操作字符串(4)Qt还提供了另一种方便的字符串组合方式,使用QString::arg()函数,此函数的重载可以处理很多的数据类型。此外,一些重载具有额外的参数对字段的宽度、数字基数或者浮点数精度进行控制。通常,相对于QString::sprintf()函数,QString::arg()函数是一个比较好的解决方案,因为其类型安全,完全支持Unicode,并且允许改变"%n"参数的顺序。例如:QStringstr;str=QString("%1wasbornin%2.").arg("John").arg(1998);//str="Johnwasbornin1998."(5)QString也提供了一些其他组合字符串的方法,包括如下几种。①insert()函数:在原字符串特定的位置插入另一个字符串。②prepend()函数:在原字符串的开头插入另一个字符串。③replace()函数:用指定的字符串代替原字符串中的某些字符。(6)很多时候,去掉一个字符串两端的空白(空白字符包括回车字符“\n”、换行字符“\r”、制表符“\t”和空格字符“”等)非常有用,如获取用户输入的账号时。①QString::trimmed()函数:移除字符串两端的空白字符。②QString::simplified()函数:移除字符串两端的空白字符,使用单个空格字符“”代替字符串中出现的空白字符。例如:QStringstr="Welcome\tto\nyou!";str=str.trimmed(); //str="Welcome\tto\nyou!"02查询字符串数据查询字符串数据(1)QString::startsWith()函数判断一个字符串是否以某个字符串开头。此函数具有两个参数。第一个参数指定了一个字符串,第二个参数指定是否大小写敏感(默认情况下,是大小写敏感的),例如:QStringstr="Welcometoyou!";str.startsWith("Welcome",Qt::CaseSensitive); //返回truestr.startsWith("you",Qt::CaseSensitive); //返回false(2)QString::endsWith()函数类似于QString::startsWith()函数,此函数判断一个字符串是否以某个字符串结尾。(3)QString::contains()函数判断一个指定的字符串是否出现过,例如:QStringstr="Welcometoyou!";str.contains("Welcome",Qt::CaseSensitive); //返回true查询字符串数据(4)比较两个字符串也是经常使用的功能,QString提供了多种比较手段。①operator<(constQString&):比较一个字符串是否小于另一个字符串。如果是,则返回true。②operator<=(constQString&):比较一个字符串是否小于等于另一个字符串。如果是,则返回true。③operator==(constQString&):比较两个字符串是否相等。如果相等,则返回true。④operator>=(constQString&):比较一个字符串是否大于等于另一个字符串。如果是,则返回true。⑤localeAwareCompare(constQString&,constQString&):静态函数,比较前后两个字符串。⑥compare(constQString&,constQString&,Qt::CaseSensitivity):该函数可以指定是否进行大小写的比较,而大小写的比较是完全基于字符的Unicode编码值的,而且是非常快的,返回值类似于localeAwareCompare()函数。03字符串的转换字符串的转换QString类提供了丰富的转换函数,可以将一个字符串转换为数值类型或者其他的字符编码集。(1)QString::toInt()函数将字符串转换为整型数值,类似的函数还有toDouble()、toFloat()、toLong()、toLongLong()等。下面举个例子说明其用法:QStringstr="125"; //初始化一个"125"的字符串boolok;inthex=str.toInt(&ok,16); //ok=true,hex=293intdec=str.toInt(&ok,10); //ok=true,dec=125(2)QString提供的字符编码集的转换函数将会返回一个constchar*类型版本的QByteArray,即构造函数QByteArray(constchar*)构造的QByteArray对象。QByteArray类具有一个字节数组,它既可以存储原始字节(rawbytes),也可以存储传统的以“\0”结尾的8位的字符串。在Qt中,使用QByteArray比使用constchar*更方便,且QByteArray也支持隐式共享。转换函数有以下几种。①toAscii():返回一个ASCII编码的8位字符串。②toLatin1():返回一个Latin-1(ISO8859-1)编码的8位字符串。③toUtf8():返回一个UTF-8编码的8位字符串(UTF-8是ASCII码的超集,它支持整个Unicode字符集)。④toLocal8Bit():返回一个系统本地(locale)编码的8位字符串。字符串的转换下面举例说明其用法:QStringstr="Welcometoyou!"; //初始化一个字符串对象QByteArrayba=str.toAscii(); //(a)qDebug()<<ba; //(b)ba.append("Hello,World!"); //(c)qDebug()<<ba.data(); //输出最后结果一个NULL字符串就是使用QString的默认构造函数或者使用“(constchar*)0”作为参数的构造函数创建的QString字符串对象;而一个空字符串是一个大小为0的字符串。一个NULL字符串一定是一个空字符串,而一个空字符串未必是一个NULL字符串。例如:QString().isNull(); //结果为trueQString().isEmpty(); //结果为trueQString("").isNull(); //结果为falseQString("").isEmpty(); //结果为trueQT5开发及实例(第5版)第2章Qt5模板库、工具类及控件——容器类容器类这样的数据类型包含了通常使用的大多数数据类型,包括基本数据类型(如int和double等)和Qt的一些数据类型(如QString、QDate和QTime等)。不过,Qt的QObject及其他的子类(如QWidget和Qdialog等)是不能够存储在容器中的,例如:QList<QToolBar>list;一个可代替的方案是存储QObject及其子类的指针,例如:QList<QToolBar*>list;Qt的容器类是可以嵌套的,例如:QHash<QString,QList<double>>Qt的容器类为遍历其中的内容提供了以下两种方法。(1)Java风格的迭代器(Java-styleiterators)。(2)STL风格的迭代器(STL-styleiterators),能够同Qt和STL的通用算法一起使用,并且在效率上也略胜一筹。01QList类、QLinkedList类和QVector类1.QList类2.QLinkedList类3.QVector类4.Java风格迭代器遍历容器5.STL风格迭代器遍历容器QList类、QLinkedList类和QVector类经常使用的Qt容器类有QList、QLinkedList和QVector等。在开发一个较高性能需求的应用程序时,程序员会比较关注这些容器类的运行效率。表列出了QList、QLinkedList和QVector容器的时间复杂度比较。容
器
类查
找插
入头
部
添
加尾
部
添
加QListO(1)O(n)Amort.O(1)Amort.O(1)QLinkedListO(n)O(1)O(1)O(1)QVectorO(1)O(n)O(n)Amort.O(1)1.QList类QList<T>是迄今为止最常用的容器类,它存储给定数据类型T的一列数值。继承自QList类的子类有QItemSelection、QQueue、QSignalSpy、QStringList和QTestEventList。QList不仅提供了可以在列表中进行追加的QList::append()和Qlist::prepend()函数,还提供了在列表中间完成插入操作的QList::insert()函数。相对于任何其他的Qt容器类,为了使可执行代码尽可能少,QList被高度优化。QList<T>维护了一个指针数组,该数组存储的指针指向QList<T>存储的列表项的内容。因此,QList<T>提供了基于下标的快速访问。QList类、QLinkedList类和QVector类对于不同的数据类型,QList<T>采取不同的存储策略,存储策略有以下几种。(1)如果T是一个指针类型或指针大小的基本类型(即该基本类型占有的字节数和指针类型占有的字节数相同),QList<T>会将数值直接存储在它的数组中。(2)如果QList<T>存储对象的指针,则该指针指向实际存储的对象。下面举一个例子:#include<QDebug>intmain(intargc,char*argv[]){ QList<QString>list; //(a) { QStringstr("Thisisateststring"); list<<str; //(b) } //(c) qDebug()<<list[0]<<"Howareyou!"; return0;}QList类、QLinkedList类和QVector类2.QLinkedList类QLinkedList<T>是一个链式列表,它以非连续的内存块保存数据。QLinkedList<T>不能使用下标,只能使用迭代器访问它的数据项。与QList相比,当对一个很大的列表进行插入操作时,QLinkedList具有更高的效率。3.QVector类QVector<T>在相邻的内存中存储给定数据类型T的一组数值。在一个QVector的前部或者中间位置进行插入操作的速度是很慢的,这是因为这样的操作将导致内存中的大量数据被移动,这是由QVector存储数据的方式决定的。QVector<T>既可以使用下标访问数据项,也可以使用迭代器访问数据项。继承自QVector类的子类有QPolygon、QPolygonF和QStack。QList类、QLinkedList类和QVector类4.Java风格迭代器遍历容器Java风格迭代器同STL风格迭代器相比,使用起来更简单方便,不过这也是以轻微的性能损耗为代价的。对于每一个容器类,Qt提供了两种类型的Java风格迭代器数据类型,即只读迭代器类和读写迭代器类,见表。容
器
类只读迭代器类读写迭代器类QList<T>,QQueue<T>QListIterator<T>QMutableListIterator<T>QLinkedList<T>QLinkedListIterator<T>QMutableLinkedListIterator<T>QVector<T>,QStack<T>QVectorIterator<T>QMutableVectorIterator<T>QList类、QLinkedList类和QVector类(1)QList只读遍历方法。【例】(简单)(CH201)通过控制台程序实现QList只读遍历方法。其具体代码如下:#include<QCoreApplication> #include<QDebug> //(a)intmain(intargc,char*argv[]){QCoreApplicationa(argc,argv); //(b)QList<int>list; //创建一个QList<int>栈对象listlist<<1<<2<<3<<4<<5; //用操作运算符“<<”输入五个整数QListIterator<int>i(list); //(c)for(;i.hasNext();) //(d)qDebug()<<i.next();returna.exec();}QList类、QLinkedList类和QVector类(2)QListIterator<T>是只读迭代器,它不能完成列表项的插入和删除操作。读写迭代器QMutableListIterator<T>除提供基本的遍历操作(与QListIterator的操作相同)外,还提供了insert()插入操作函数、remove()删除操作函数和修改数据函数等。【例】(简单)(CH202)通过控制台程序实现QList读写遍历方法。具体代码如下:#include<QCoreApplication>#include<QDebug>intmain(intargc,char*argv[]){ QCoreApplicationa(argc,argv); QList<int>list; //创建一个空的列表list QMutableListIterator<int>i(list); //创建上述列表的读写迭代器 for(intj=0;j<10;++j) i.insert(j); //(a) for(i.toFront();i.hasNext();) //(b) qDebug()<<i.next(); for(i.toBack();i.hasPrevious();) //(c) { if(i.previous()%2==0)
i.remove(); else i.setValue(i.peekNext()*10); //(d) } for(i.toFront();i.hasNext();) //重新遍历并输出列表 qDebug()<<i.next(); returna.exec();}QList类、QLinkedList类和QVector类5.STL风格迭代器遍历容器对于每个容器类,Qt都提供了两种类型的STL风格迭代器数据类型:一种提供只读访问;另一种提供读写访问。由于只读类型的迭代器的运行速度要比读写迭代器的运行速度快,所以应尽可能地使用只读类型的迭代器。STL风格迭代器的两种分类见表。容
器
类只读迭代器类读写迭代器类QList<T>,QQueue<T>QList<T>::const_iteratorQList<T>::iteratorQLinkedList<T>QLinkedList<T>::const_iteratorQLinkedList<T>::iteratorQVector<T>,QStack<T>QVector<T>::const_iteratorQVector<T>::iteratorQList类、QLinkedList类和QVector类【例】(简单)(CH203)使用STL风格迭代器。具体代码如下:#include<QCoreApplication>#include<QDebug>intmain(intargc,char*argv[]){ QCoreApplicationa(argc,argv); QList<int>list; //初始化一个空的QList<int>列表 for(intj=0;j<10;j++) list.insert(list.end(),j); //(a) QList<int>::iteratori; //初始化一个QList<int>::iterator读写迭代器 for(i=list.begin();i!=list.end();++i) //(b) { qDebug()<<(*i); *i=(*i)*10; } //初始化一个QList<int>::const_iterator读写迭代器 QList<int>::const_iteratorci; //在控制台输出列表的所有值 for(ci=list.constBegin();ci!=list.constEnd();++ci) qDebug()<<*ci; returna.exec();}02QMap类和QHash类1.QMap类2.QHash类3.Java风格迭代器遍历容器4.STL风格迭代器遍历容器QMap类和QHash类1.QMap类QMap<Key,T>提供了一个从类型为Key的键到类型为T的值的映射。通常,QMap存储的数据形式是一个键对应一个值,并且按照键Key的顺序存储数据。为了能够支持一键多值的情况,QMap提供了QMap<Key,T>::insertMulti()和QMap<Key,T>::values()函数。存储一键多值的数据时,也可以使用QMultiMap<Key,T>容器,它继承自QMap。2.QHash类QHash<Key,T>具有与QMap几乎完全相同的API。QHash维护着一张哈希表(HashTable),哈希表的大小与QHash的数据项的数目相适应。QHash以任意的顺序组织它的数据。当存储数据的顺序无关紧要时,建议使用QHash作为存放数据的容器。QHash也可以存储一键多值形式的数据,它的子类QMultiHash<Key,T>实现了一键多值的语义。QMap类和QHash类3.Java风格迭代器遍历容器对于每一个容器类,Qt都提供了两种类型的Java风格迭代器数据类型:一种提供只读访问;另一种提供读写访问。Java风格迭代器的两种分类见表。容
器
类只读迭代器类读写迭代器类QMap<Key,T>,QMultiMap<Key,T>QMapIterator<Key,T>QMutableMapIterator<Key,T>QHash<Key,T>,QMultiHash<Key,T>QHashIterator<Key,T>QMutableHashIterator<Key,T>QMap类和QHash类【例】(简单)(CH204)在QMap中的插入、遍历和修改。具体代码如下:#include<QCoreApplication>#include<QDebug>intmain(intargc,char*argv[]){ QCoreApplicationa(argc,argv); QMap<QString,QString>map; //创建一个QMap栈对象 //向栈对象插入<城市,区号>对 map.insert("beijing","111"); map.insert("shanghai","021"); map.insert("nanjing","025"); QMapIterator<QString,QString>i(map); //创建一个只读迭代器 for(;i.hasNext();) //(a) { i.next(); qDebug()<<""<<i.key()<<""<<i.value(); } QMutableMapIterator<QString,QString>mi(map); if(mi.findNext("111")) //(b) mi.setValue("010"); QMapIterator<QString,QString>modi(map); qDebug()<<""; for(;modi.hasNext();) //再次遍历并输出修改后的结果 { modi.next(); qDebug()<<""<<modi.key()<<""<<modi.value(); } returna.exec();}QMap类和QHash类4.STL风格迭代器遍历容器对于每一个容器类,Qt都提供了两种类型的STL风格迭代器数据类型:一种提供只读访问;另一种提供读写访问。STL风格迭代器的两种分类见表。容
器
类只读迭代器类读写迭代器类QMap<Key,T>,QMultiMap<Key,T>QMap<Key,T>::const_iteratorQMap<Key,T>::iteratorQHash<Key,T>,QMultiHash<Key,T>QHash<Key,T>::const_iteratorQHash<Key,T>::iteratorQMap类和QHash类【例】(简单)(CH205)功能与使用Java风格迭代器的例子基本相同。不同的是,这里通过查找键来实现值的修改。具体代码如下:#include<QCoreApplication>#include<QDebug>intmain(intargc,char*argv[]){ QCoreApplicationa(argc,argv); QMap<QString,QString>map; map.insert("beijing","111"); map.insert("shanghai","021"); map.insert("nanjing","025"); QMap<QString,QString>::const_iteratori; for(i=map.constBegin();i!=map.constEnd();++i) qDebug()<<""<<i.key()<<""<<i.value(); QMap<QString,QString>::iteratormi; mi=map.find("beijing"); if(mi!=map.end()) mi.value()="010"; //(a) QMap<QString,QString>::const_iteratormodi; qDebug()<<""; for(modi=map.constBegin();modi!=map.constEnd();++modi) qDebug()<<""<<modi.key()<<""<<modi.value(); returna.exec();}QT5开发及实例(第5版)第2章Qt5模板库、工具类及控件——QVariant类QVariant类【例】(简单)(CH206)QVariant类的用法。以“直接编写代码”(即取消勾选“Generateform”复选框)方式创建Qt项目,项目名myVariant,“ClassInformation”页基类选“QWidget”。建好项目后,在widget.cpp文件中编写代码,具体内容。QT5开发及实例(第5版)第2章Qt5模板库、工具类及控件——算法及正则表达式01Qt5常用算法Qt5常用算法【例】(简单)(CH207)几个常用算法。#include<QCoreApplication>#include<QDebug>intmain(intargc,char*argv[]){ QCoreApplicationa0(argc,argv); doublea=-19.3,b=9.7; doublec=qAbs(a); //(a) doublemax=qMax(b,c); //(b) intbn=qRound(b); //(c) intcn=qRound(c); qDebug()<<"a="<<a; qDebug()<<"b="<<b; qDebug()<<"c=qAbs(a)="<<c; qDebug()<<"qMax(b,c)="<<max; qDebug()<<"bn=qRound(b)="<<bn; qDebug()<<"cn=qRound(c)="<<cn; qSwap(bn,cn); //(d) //调用qDebug()函数输出所有的计算结果 qDebug()<<"qSwap(bn,cn):"<<"bn="<<bn<<"cn="<<cn; returna0.exec();}02基本的正则表达式基本的正则表达式正则表达式由表达式(expressions)、量词(quantifiers)和断言(assertions)组成。(1)最简单的表达式是一个字符。字符集可以使用表达式如“[AEIOU]”,表示匹配所有的大写元音字母;使用“[^AEIOU]”,表示匹配所有非元音字母,即辅音字母;连续的字符集可以使用表达式如“[a-z]”,表示匹配所有的小写英文字母。(2)量词说明表达式出现的次数,如“x[1,2]”表示“x”可以至少有一个,至多有两个。在计算机语言中,标识符通常要求以字母或下画线(也称下画线)开头,后面可以是字母、数字和下画线。满足条件的标识符表示为:"[A-Za-z_]+[A-Za-z_0-9]*"正则表达式的量词见表。量
词含
义量
词含
义E?匹配0次或1次E[n,]至少匹配n次E+匹配1次或多次E[,m]最多匹配m次E*匹配0次或多次E[n,m]至少匹配n次,最多匹配m次E[n]匹配n次
基本的正则表达式(3)“^”“$”“\b”都是正则表达式的断言,正则表达式的断言见表。符
号含
义符
号含
义^表示在字符串开头进行匹配\B非单词边界$表示在字符串结尾进行匹配(?=E)表示表达式后紧随E才匹配\b单词边界(?!E)表示表达式后不跟随E才匹配例如,若要只有在using后面是namespace时才匹配using,则可以使用“using(?=E\s+namespace)”(此处“?=E”后的“\s”表示匹配一个空白字符,下同)。QT5开发及实例(第5版)第2章Qt5模板库、工具类及控件——控
件01按钮组(Buttons)按钮组(Buttons)按钮组(Buttons)如图。按钮组(Buttons)中各个按钮的名称依次解释如下。
PushButton:按钮。
ToolButton:工具按钮。
RadioButton:单选按钮。
CheckBox:复选框。
CommandLinkButton:命令链接按钮。
DialogButtonBox:对话框按钮盒。按钮组(Buttons)【例】(简单)(CH208)以QPushButton为例介绍按钮的用法。(1)以“直接编写代码”(即取消勾选“Generateform”复选框)方式创建Qt项目,项目名PushButtonTest,“ClassInformation”页基类选“QWidget”,类名命名为“MyWidget”。(2)在头文件mywidget.h中的具体代码如下:#ifndefMYWIDGET_H#defineMYWIDGET_H#include<QWidget>classMyWidget:publicQWidget{Q_OBJECTpublic:MyWidget(QWidget*parent=0);~MyWidget();};#endif//MYWIDGET_H按钮组(Buttons)(3)在源文件mywidget.cpp中的具体代码如下:#include"mywidget.h"#include<qapplication.h>#include<qpushbutton.h>#include<qfont.h>MyWidget::MyWidget(QWidget*parent):QWidget(parent){setMinimumSize(200,120);setMaximumSize(200,120);QPushButton*quit=newQPushButton("Quit",this);quit->setGeometry(62,40,75,30);quit->setFont(QFont("Times",18,QFont::Bold));connect(quit,SIGNAL(clicked()),qApp,SLOT(quit()));}MyWidget::~MyWidget(){}按钮组(Buttons)(4)在源文件main.cpp中的具体代码如下:#include"mywidget.h"#include<QApplication>intmain(intargc,char*argv[]){ QApplicationa(argc,argv); MyWidgetw; w.setGeometry(100,100,200,120); w.show(); returna.exec();}(5)QPushButton实例的运行结果如图。02输入部件组(InputWidgets)1.QDateTime类2.QTimer类输入部件组(InputWidgets)输入部件组(InputWidgets)如图,组中各个部件的名称依次解释如下。
ComboBox:组合框。
FontComboBox:字体组合框。
LineEdit:行编辑框。
TextEdit:文本编辑框。
PlainTextEdit:纯文本编辑框。
SpinBox:数字显示框(自旋盒)。
DoubleSpinBox:双自旋盒。
TimeEdit:时间编辑。
DateEdit:日期编辑。
Date/TimeEdit:日期/时间编辑。
Dial:拨号。
HorizontalScrollBar:横向滚动条。
VerticalScrollBar:垂直滚动条。
HorizontalSlider:横向滑块。
VerticalSlider:垂直滑块。
KeySequenceEdit:按键序列编辑框。输入部件组(InputWidgets)1.QDateTime类Date/TimeEdit对应于QDateTime类,在Qt5中可以使用它来获得系统时间。通过QDateTime::currentDateTime()来获取本地系统的时间和日期信息。可以通过date()和time()来返回datetime中的日期和时间部分,典型代码如下:QLabel*datalabel=newQLabel();QDateTime*datatime=newQDateTime(QDateTime::currentDateTime());datalabel->setText(datatime->date().toString());datalabel->show();输入部件组(InputWidgets)2.QTimer类定时器(QTimer)的使用非常简单,只需要以下几个步骤就可以完成定时器的应用。(1)新建一个定时器。QTimer*time_clock=newQTimer(parent);(2)连接这个定时器的信号和槽,利用定时器的timeout()。connect(time_clock,SIGNAL(timeout()),this,SLOT(slottimedone()));即定时时间一到就会发送timeout()信号,从而触发slottimedone()槽去完成某件事情。(3)开启定时器,并设定定时周期。定时器定时有两种方式:start(inttime)和setSingleShot(true)。其中,start(inttime)表示每隔“time”秒就会重启定时器,可以重复触发定时,利用stop()将定时器关掉;而setSingleShot(true)则是仅启动定时器一次。工程中常用的是前者,例如:time_clock->start(2000);03显示控件组(DisplayWidgets)1.GraphicsView2.TextBrowser3.QQuickWidget显示控件组(DisplayWidgets)显示控件组(DisplayWidgets)如图。显示控件组(DisplayWidgets)中各个控件的名称依次解释如下。
Label:标签。
TextBrowser:文本浏览器。
GraphicsView:图形视图。
CalendarWidget:日历。
LCDNumber:液晶数字。
ProgressBar:进度条。
HorizontalLine:水平线。
VerticalLine:垂直线。
OpenGLWidget:开放式图形库工具。
QQuickWidget:嵌入QML工具。显示控件组(DisplayWidgets)1.GraphicsViewGraphicsView对应于QGraphicsView类,提供了Qt5的图形视图框架2.TextBrowserTextBrowser对应于QTextBrowser类。QTextBrowser类继承自QTextEdit,而且仅是只读的,对里面的内容不能进行更改,但是相对于QTextEdit来讲,它还具有链接文本的作用。QTextBrowser的属性有以下几点:modified:constbool//通过布尔值来说明其内容是否被修改openExternalLinks:boolopenLinks:boolreadOnly:constboolsearchPaths:QStringListsource:QUrlundoRedoEnabled:constbool通过以上的属性设置,可以设定QTextBrowser是否允许外部链接,是否为只读属性,外部链接的路径及链接的内容,是否可以进行撤销等操作。QTextBrowser还提供了几种比较有用的槽(SLOTS),即:virtualvoidbackward()virtualvoidforward()virtualvoidhome()显示控件组(DisplayWidgets)3.QQuickWidget传统QWidget程序可以用它来嵌入QML代码,为Qt开发者将桌面应用迁移到QtQuick提供了方便,但目前在QML中尚不能嵌入其他非QML窗口,因为QML的渲染机制和QWidget的是不一样的。04空间间隔组(Spacers)空间间隔组(Spacers)空间间隔组(Spacers)如图。空间间隔组(Spacers)中各个控件的名称依次解释如下。
HorizontalSpacer:水平间隔。
VerticalSpacer:垂直间隔。05布局管理组(Layouts)布局管理组(Layouts)布局管理组(Layouts)如图。布局管理组(Layouts)中各个控件的名称依次解释如下。VerticalLayout:垂直布局。HorizontalLayout:横向(水平)布局。GridLayout:网格布局。FormLayout:表单布局。06容器组(Containers)1.创建窗口2.使用布局容器组(Containers)容器组(Containers)如图。容器组(Containers)中各个控件的名称依次解释如下。
GroupBox:组框。
ScrollArea:滚动区域。
ToolBox:工具箱。
TabWidget:标签小部件。
StackedWidget:堆叠部件。
Frame:帧。
Widget:小部件。
MDIArea:MDI区域。
DockWidget:停靠窗体部件。
QAxWidget:封装Flash的ActiveX控件。容器组(Containers)1.创建窗口如果Widget未使用父级进行创建,则在显示时视为窗口或顶层Widget。由于顶层Widget没有父级对象类来确保在其不再被使用时就被删除,所以需要开发人员在应用程序中对其进行跟踪。例如,使用QWidget创建和显示具有默认大小的窗口:QWidget*window=newQWidget();window->resize(320,240);window->show();QPushButton*button=newQPushButton(tr("Pressme"),window);button->move(100,100);button->show();容器组(Containers)2.使用布局通常,子Widget是通过使用布局对象在窗口中进行排列的,而不是通过指定位置和大小进行排列的。在此,构造一个并排排列的标签和行编辑框Widget:QLabel
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五年度红木家具定制与古建筑修复合同
- 长春2025年度货运合同纠纷律师调解服务协议
- 2025年度租赁合同解除函及房屋租赁市场调研报告
- 产品入库管理表格(零售业特定)
- 汽车维修技术故障诊断与排除试卷及答案解析
- 租赁平台房东与租客权益保障协议
- 农村环境保护与生态恢复项目合作合同书
- 乡村新型产业开发项目协议
- 史记中的人物故事深度解读
- 铺货担保合同合作协议
- 2025年黑龙江生态工程职业学院单招职业倾向性测试题库及答案一套
- 2025年哈尔滨幼儿师范高等专科学校单招职业技能测试题库完整
- 做最勇敢的自己
- 小学数学中巧用信息技术创造情境教学
- 安徽省历年中考语文现代文阅读之非连续性文本阅读6篇(截至2024年)
- GB/T 23694-2024风险管理术语
- 公司员工生日会活动复盘
- 2025年北京青年政治学院高职单招高职单招英语2016-2024年参考题库含答案解析
- 永辉超市存货管理问题及优化建议9700字
- 大模型落地应用实践方案
- 售后服务组织结构及岗位职责
评论
0/150
提交评论