配色: 字号:
第1章 Qt概述
2022-04-20 | 阅:  转:  |  分享 
  
第1章Qt概述——什么是Qt1.Qt的发展Qt最早是在1991年由奇趣科技开发的,1996年进入商业领域,成为全世界范围内数千种成功的应
用程序的基础。它也是目前流行的Linux桌面环境KDE的基础,KDE是Linux发行版的主要一个标准组件。2008年,奇趣科技被诺
基亚公司收购,Qt成为诺基亚旗下的编程语言工具。从2009年5月发布的Qt4.5起,诺基亚公司宣布Qt源代码库面向公众开放,Qt
开发人员可通过为Qt及与其相关的项目贡献代码、翻译、示例及其他内容,协助引导和塑造Qt的未来发展。2011年,Digia公司(芬兰
的一家IT服务公司)从诺基亚公司收购了Qt的商业版权。2012年8月9日,作为非核心资产剥离计划的一部分,诺基亚公司宣布将Qt软件
业务正式出售给Digia公司。2013年7月3日,Digia公司Qt开发团队在其官方博客上宣布Qt5.1正式版发布;同年12月1
1日,又发布Qt5.2正式版。2014年4月,跨平台集成开发环境QtCreator3.1.0正式发布;同年5月20日,配套发
布了Qt5.3正式版。2.Qt5.11版的改进(1)对QtCore进行完善,更好地支持Unicode。在QtNetwork
中,iOS可支持ALPN和HTTP/2。(2)QtGUI基于MicrosoftUIAutomation,并且更好地支持高DP
I显示。改进Linux上的打印对话框,为CUPS的选项提供了更好的支持。(3)(4)QtQML编译器管道负责解析和编译QML,性
能提高、更可维护。将QML编译为与平台无关的字节码。在QtQuick中,支持在Image元素中加载压缩纹理,支持.ktx和.pk
m容器文件格式,可以通过GPU直接处理,减少应用程序启动时间和内存消耗。2.Qt5.11版的改进(5)QtLocation实现
对逐向导航的支持,通过API来创建不绑定到QQuickItems的地图对象。改进MapPolyline对象的性能,图层支持与Map
组件结合。(6)(7)更新QtWebengine的Chromium版本。支持嵌入式DevTools,包含可安装的Cookie过滤
器和配额权限。(8)使用QtforWebassembly,允许用户将Web和浏览器作为Qt应用程序的平台。支持基于硬件的图形层
和VSP2硬件合成平台的技术预览版,有助于提高视频性能并降低功耗。完善QtSerialbus和Bluetooth对CAN总线和B
TLE的支持。KNX模块增加对OPC/UA的支持。(9)不再支持MSVC2013、QNX6.6和macOS10.10。3.Q
t版本说明Qt按照不同的版本发行,分为商业版和开源版。Qt商业版为商业软件提供开发环境,它们提供传统商业软件发行版,并且提供在协议
有效期内的免费升级和技术支持服务。而Qt开源版是为了开发自由而设计的开放源码软件,它提供了和商业版本同样的功能,在GNU通用公共许
可证下,它是免费的。第1章Qt概述——Qt5的安装011.下载Qt5.112.申请免费账号下载Qt和申请免费账号3.Qt版
本说明在Qt官方网站下载Qt5.11安装包,Qt5.11官方下载地址如下:http://www.qtcn.org/bbs/read
-htm-tid-1075.htmlhttp://www.qtcn.org/bbs/read-htm-tid-1075.htmlQ
t5.9之后的安装包与之前相比,不再区分VS版本和MinGW版本,而是全都整合到了一个安装包中。因此,与之前的安装包相
比,体积也是大了不少,以前是1G多,现在是2G多。选择WindowsHost下的Qt5.11.0forWindows
(2.0GB),如图1.1所示。2.申请免费账号登录TheQtCompany公司官网(https://www.qt.io/ht
tps://www.qt.io),单击 ,选择 ,进入Qt申请免费账号页,如图1.2所示。02安装Qt5.11安装Qt5
.11双击启动安装向导,加入Qt5.11.1的安装欢迎页面,如图1.3所示。单击“Next”按钮,出现如图1.4示界面要求输入Qt
免费账号,并设置密码。安装Qt5.11单击“Next”按钮,进入“设置-Qt5.11.1”页。单击“下一步”按钮,进入“安装文
件夹”页,系统列出Qt的默认安装路径,用户可以修改,并勾选“AssociatecommonfiletypeswithQt
Creator.”复选框,如图1.5所示。单击“下一步”按钮,在接下来的“选择组件”页,单击“全选”按钮选择安装全部组件,如图1
.6所示。安装Qt5.11单击“Next”按钮,在“许可协议”页,选中“Ihavereadandagreetoth
etermscontainedinthelicenseagreements.”接受许可协议,如图1.7所示。单击“下一
步”按钮,进入Qt开始菜单快捷方式,可修改系统默认的Qt开始菜单,如图1.8所示。安装Qt5.11单击“下一步”按钮,进入“已
做好安装准备”页,如图1.9所示。单击“安装”按钮,系统开始进行安装,如图1.10所示。安装Qt5.11安装进程完成后,如图1
.11所示,勾选“LaunchQtCreator”复选框,单击“完成”按钮结束安装。系统会自行启动QtCreator,Qt
Creator初始界面。03运行Qt5Creator运行Qt5CreatorQtCreator运行后,进入QtCrea
tor初始界面,如图1.12所示。运行Qt5Creator在欢迎界面中可以看到最左端的一栏按钮,该栏按钮功能分别如下。?(
欢迎):在此处可以选择自带的例子演示,在下一次打开欢迎界面时能够显示最近一次的一些项目,免除自己再去查找的麻烦。?(编辑):在
此处编写代码进行程序设计。?(设计):在这里设计图形界面,进行部件属性设置、信号和槽设置及布局设置等操作。?(Debug)
:在此界面下可以根据需要调试程序,以便跟踪观察程序的运行情况。?(项目):在此界面下可以完成开发环境的相关配置。?(帮助)
:可以在此处输入关键字,查找相关帮助信息。04Qt5开发环境Qt5开发环境在设计器中用鼠标直接拖曳这些窗口部件,能够高效、快速
地实现GUI界面的设计,界面直观形象,所见即所得。QtDesigner界面如图1.13所示。Qt5开发环境进入Qt设计器主界面
后,看到的form部分(如图1.14所示)就是将要设计的顶层窗口部件(顶层窗口部件是其他子窗口部件的载体)。Qt5开发环境选中Q
t设计器“控件”→“视图”中的全部选项,在Qt设计器的主界面上可以看到设计器提供的一些编辑工具子窗口(如图1.13所示)。?对象
查看器(ObjectInspector):列出了界面中所有窗口部件,以及各窗口部件的父子关系和包容关系。?属性编辑器(Prop
ertyEditor):列出了窗口部件可编辑的属性。?Action编辑器(ActionEditor):列出了为窗口部件设计的
QAction动作,通过“添加”或“删除”按钮可以新建一个可命名的QAction动作或删除指定的QAction动作。?信号和槽编
辑器(Signals&SlotsEditor):列出了在Qt设计器中关联的信号和槽,通过双击列中的对象或信号/槽,可以进行对
象的选择和信号/槽的选择。?控件编辑模式(EditWidgets):可以在Qt设计器中添加GUI窗口部件并修改它们的属性和外观
。?信号/槽编辑模式(EditSignals/Slots):可以在Qt设计器中的窗口部件上关联Qt已经定义好的信号和槽。?伙
伴编辑模式(EditBuddies):可以在Qt设计器中的窗口部件上建立QLabel标签和其他窗口部件的伙伴关系。?Tab顺序
编辑模式(EditTabOrder):可以在Qt设计器中的窗口部件上设置Tab键在窗口部件上的焦点顺序。第1章Qt概述——
Qt5开发步骤及实例Qt5开发步骤及实例下面以完成计算圆面积功能这一简单例子来介绍Qt开发程序的流程,其中涉及Qt应用程序用户
界面中的事件关联操作内容—信号和槽机制(Signal&Slot)。当用户输入一个圆的半径后,可以显示计算后的圆的面积值。运行效
果如图1.15所示。011.界面设计2.编写相应的计算圆面积代码设计器Qt5Designer实现【例】(简单)(CH101)采
用设计器QtDesigner实现计算圆面积,完成如图1.15所示的功能。首先进行界面设计,然后编写相应的计算圆面积代码。1.界面
设计步骤如下。(1)单击运行QtCreator,进入欢迎界面(见图1.10)。单击其上按钮,或者选择“文件”→“新建文件或项
目...”命令,创建一个新的工程,出现“新建项目”窗口,如图1.16所示。1.界面设计(2)单击选择项目“Application”
→“QtWidgetsApplication”选项,单击“Choose...”按钮,进入下一步。(3)选择保存项目的路径并定义
自己项目的名字。注意,保存项目的路径中不能有中文字。项目命名没有大小写要求,依据个人习惯命名即可。这里将项目命名为Dialog,保
存路径为D:\Qt\CH1\CH101,如图1.17所示。单击“下一步”按钮进入下一步骤。1.界面设计(5)根据实际需要,选择一个
“基类”。这里选择QDialog对话框类作为基类,这时“类名”“头文件”“源文件”及“界面文件”都出现默认的文件名。注意,对这些文
件名都可以根据具体需要进行相应的修改。默认选中“创建界面”复选框,表示需要采用界面设计器来设计界面,否则需要利用代码完成界面的设计
,如图1.19所示。1.界面设计(6)选择完成后单击“下一步”按钮,相应的文件自动加载到项目文件列表中,如图1.20所示。1.界面
设计单击“完成”按钮完成创建,文件列表中的文件自动分类显示,如图1.21(a)所示,各个文件包含在相应的文件夹中,单击文件夹前的“
”图标可以显示该文件夹下的文件;而单击文件夹前面的“”图标则可隐藏该文件夹下的文件。单击上部灰色工具栏中的过滤符号后,弹
出一个下拉列表,勾选“简化树形视图”则切换到简单的文件列表,如图1.21(b)所示。1.界面设计(7)双击dialog.ui,进
入界面设计器QtDesigner编辑状态,开始进行设计器(QtDesigner)编程。拖曳控件容器栏的滑动条,在最后的Disp
layWidgets容器栏(图1.22)中找到Label标签控件,拖曳三个此控件到中间的编辑框中;同样,在InputWidge
ts容器栏(图1.21)中找到LineEdit文本控件,拖曳此控件到中间的编辑框中,用于输入半径值;在Buttons容器栏(图1
.24)中找到PushButton按钮控件,拖曳此控件到中间的编辑框中,用于提交响应单击事件。1.界面设计下面将修改拖曳到编
辑框中的各控件的属性,如图1.25所示,对象监视器内容如图1.26所示。1.界面设计然后需要对各控件属性进行修改,内容见表1.
1。ClasstextobjectNameQLabel半径:radiusLabelQLineEdit?radiusLineEdit
QLabel面积:areaLabel_1QLabel?areaLabel_2QPushButton计算countBtn其中,修改控
件Text值的方法有如下两种。?直接双击控件本身即可修改。?在QtDesigner设计器的属性栏中修改,如修改表示半径的La
bel标签,如图1.25所示。1.界面设计修改areaLabel_2的“frameShape”为Panel;“frameShado
w”为Sunken,如图1.26所示。最终效果如图1.27所示。2.编写相应的计算圆面积代码首先简单认识一下Qt编程环境。找到文
件列表中自动添加的main.cpp文件,如图1.19所示。每个工程都有一个执行的入口函数,此文件中的main()函数就是此工程的入
口。下面详细介绍main()函数的相关内容:#include"dialog.h"//(a)#includeion> //(b)intmain(intargc,charargv[]) //(c){QApplication
a(argc,argv); //(d)Dialogw;//创建一个对话框对象w.show();//(e)ret
urna.exec();//(f)}2.编写相应的计算圆面积代码其中,(a)#include"dialog.h":包含了程序
中要完成功能的Dialog类的定义,在Dialog类中封装完成所需要的功能。注意,使用哪个类就必须将包含该类的头文件引用过来。例如
,若要用到一个按钮类时,则必须在此处添加一行代码#include,这表明包含了按钮(QPushButt
on)类的定义。(b)#include:Application类的定义。在每一个使用Qt图形化应用
程序中都必须使用一个QApplication对象。QApplication管理了各种各样的图形化应用程序的广泛资源、基本设置、控制
流及事件处理等。(c)intmain(intargc,charargv[]):应用程序的入口,几乎在所有使用Qt的情况
下,main()函数只需要在将控制转交给Qt库之前执行初始化,然后Qt库通过事件向程序告知用户的行为。所有Qt程序中都必须有且只有
一个main()函数。main()函数有两个参数,即argc和argv。argc是命令行变量的数量,argv是命令行变量的数组。2
.编写相应的计算圆面积代码(d)QApplicationa(argc,argv):a是这个程序的QApplication对象
。在任何Qt的窗口系统部件被使用之前必须创建QApplication对象。它在这里被创建并且处理这些命令行变量。所有被Qt识别的命
令行参数都将从argv中被移去(并且argc也因此而减少)。(e)w.show():当创建一个窗口部件的时候,默认它是不可见的,
必须调用show()函数使它变为可见。(f)returna.exec():程序进入消息循环,等待可能的输入进行响应。这里就是m
ain()函数将控制权转交给Qt,Qt完成事件处理工作,当应用程序退出的时候,exec()函数的值就会返回。在exec()函数中,
Qt接收并处理用户和系统的事件并且将它们传递给适当的窗口部件。2.编写相应的计算圆面积代码方式1:在“LineEdit”文本框内
输入半径值,然后单击“计算”按钮,则在areaLabel_2中显示对应的圆面积。编写代码步骤如下。(1)在“计算”按钮上按鼠标右键
,在弹出的下拉菜单中选择“转到槽...”命令,在“转到槽”对话框中选择“clicked()”信号,单击“OK”按钮,如图1.28所
示。2.编写相应的计算圆面积代码(2)进入dialog.cpp文件中按钮单击事件的槽函数on_countBtn_clicked()
。信号与槽连接的具体说明参照本书后面提供的知识点链接部分。在此函数中添加如下代码:voidDialog::on_countBt
n_clicked(){boolok;QStringtempStr;QStringvalueStr=ui->radiu
sLineEdit->text();intvalueInt=valueStr.toInt(&ok);doublearea=
valueIntvalueIntPI; //计算圆面积ui->areaLabel_2->setText(tempSt
r.setNum(area));}(3)在dialog.cpp文件开始处添加以下语句:conststaticdoubleP
I=3.1416;定义全局变量PI。运行程序,在“LineEdit”文本框内输入半径值,单击“计算”按钮后,显示圆面积,完成计算
圆面积功能。2.编写相应的计算圆面积代码方式2:在“LineEdit”文本框内输入半径值,不需要单击按钮触发单击事件,直接就在a
reaLabel_2中显示圆面积。编写代码步骤如下。(1)在“LineEdit”文本框上按鼠标右键,在弹出的下拉菜单中选择“转到
槽...”命令,在“转到槽”对话框中选择“textChanged(QString)”信号,如图1.29所示。2.编写相应的计算圆面
积代码(2)单击“OK”按钮,进入dialog.cpp文件中的文本编辑框改变值内容事件的槽函数on_radiusLineEdit_
textChanged(constQString&arg1)。在此函数中添加如下代码:voidDialog::on_radi
usLineEdit_textChanged(constQString&arg1){boolok;QStringtem
pStr;QStringvalueStr=ui->radiusLineEdit->text();intvalueInt=v
alueStr.toInt(&ok);doublearea=valueIntvalueIntPI; //计算圆面积
ui->areaLabel_2->setText(tempStr.setNum(area));}02代码实现简单实例代码实现简单
实例【例】(简单)?(CH102)采用编写代码的方式来实现计算圆面积的功能。步骤如下。(1)首先创建一个新工程。创建过程和本书1.
3.1节界面设计中的第(1)~(7)步相同,只是在第(3)步中,项目命名为Dialog且保存路径为D:\Qt\CH1\CH102,
在第(5)步中,取消“创建界面”复选框的选中状态。(2)在上述工程的dialog.h中添加如下加黑代码:#includebel> //(a)#include //(a)#include //(
a)classDialog:publicQDialog{ Q_OBJECTpublic: Dialog(QWidget
parent=0); ~Dialog();private: QLabellabel1,label2;//(b) QL
ineEditlineEdit;//(b) QPushButtonbutton;//(b)};代码实现简单实例其中,(
a)加入实现Label、LineEdit、PushButton控件的头文件。(b)定义界面中的Label、LineEdit、P
ushButton控件对象。label1标签对象提示“请输入圆的半径”,label2标签对象显示圆面积计算结果,LineEdit文
本框对象用于输入半径,PushButton为“计算”命令按钮对象。Q_OBJECT宏的作用是启动Qt5元对象系统的一些特性(如支
持信号和槽等),它必须放置到类定义的私有区中。代码实现简单实例(3)在dialog.cpp中添加如下代码:#includeGridLayout> //(a)Dialog::Dialog(QWidgetparent):QDialog(paren
t){label1=newQLabel(this);label1->setText(tr("请输入圆的半径:"));lin
eEdit=newQLineEdit(this);label2=newQLabel(this);button=newQP
ushButton(this);button->setText(tr("显示对应圆的面积"));QGridLayoutma
inLayout=newQGridLayout(this);//(b)mainLayout->addWidget(label
1,0,0);mainLayout->addWidget(lineEdit,0,1);mainLayout->addWidge
t(label2,1,0);mainLayout->addWidget(button,1,1);}代码实现简单实例其中,(a)
#include为加入实现布局管理器的头文件。(b)QGridLayoutmainLayout=
newQGridLayout(this)用于布局管理器,将所有控件的位置固定。界面运行效果如图1.30所示。代码实现简单实例(4
)完成程序功能:以上第(1)~(3)步代码只完成了界面设计,下面同样通过两种触发不同控件事件的方式来完成计算圆面积的功能。方式1:
在lineEdit文本框内输入所需圆的半径值,单击“显示对应圆的面积”按钮后,在label2中显示相对应的圆的面积值。①打开di
alog.h文件,在类构造函数和控件成员声明后,添加如下加黑代码:classDialog:publicQDialog{.
..QPushButtonbutton;privateslots:voidshowArea();};代码实现简单
实例②打开dialog.cpp文件,在构造函数中添加如下加黑代码:Dialog::Dialog(QWidgetparent)
:QDialog(parent){...mainLayout->addWidget(button,1,1);conne
ct(button,SIGNAL(clicked()),this,SLOT(showArea()));}③在showArea()
中实现显示圆面积功能,代码如下:conststaticdoublePI=3.1416;voidDialog::showAr
ea(){boolok;QStringtempStr;QStringvalueStr=lineEdit->text()
;intvalueInt=valueStr.toInt(&ok);doublearea=valueIntvalueInt
PI;label2->setText(tempStr.setNum(area));}代码实现简单实例④运行程序。在lineE
dit文本框中输入圆半径值,单击“显示对应圆的面积”按钮后,在label2中显示圆面积值,最终运行结果如图1.33所示。代码实现简
单实例方式2:在lineEdit文本框中输入所需圆的半径值后,不必单击“显示对应圆的面积”按钮,直接在label2中显示圆的面积值
。操作步骤和方式1相同,只是在上述第②步中,添加的代码修改为如下加黑代码:Dialog::Dialog(QWidgetpare
nt):QDialog(parent){......mainLayout->addWidget(button,1,1);
connect(lineEdit,SIGNAL(textChanged(QString)),this,SLOT(showArea
()));}03Qt低版本实例迁移Qt低版本实例迁移《Qt5开发及实例》(第3版)以Qt5.8进行介绍,所有实例在该版本下开发
。本书以Qt5.11作为平台开发,其基本内容与Qt5.8是兼容的。如果在Qt5.11平台下打开Qt5.8的实例工程,系统显
示如图1.34所示。第1章Qt概述——Qt5的安装:概念解析00伙伴编辑模式(EditBuddies)伙伴编辑模式(Edi
tBuddies)QLabel标签和伙伴(buddy)窗口部件包括一个标签(QLabel)和一个窗口部件,它们具有伙伴关系,指当
用户激活标签的快捷键时,鼠标/键盘的焦点将会转移到它的伙伴窗口部件上。只有QLabel标签对象才可以有伙伴窗口部件,也只有在该QL
abel对象具有快捷键(在显示文本的某个字符前面添加一个前缀“&”,就可以定义快捷键)时,伙伴关系才有效。例如:QLineEdit
ageLineEdit=newQLineEdit(this);QLabelageLabel=newQLab
el("&Age",this);ageLabel->setBuddy(ageLineEdit);代码定义了ageLabel标签的组
合键为Alt+A,并将行编辑框ageLineEdit设为它的伙伴窗口部件。当用户按下Alt+A组合键时,焦点将会跳至行编辑框age
LineEdit中。第1章Qt概述——Qt5开发步骤及实例:概念解析011.信号与槽机制的连接方式2.信号与槽机制的优点3.
信号与槽机制的效率信号和槽机制(Signal&Slot)1.信号与槽机制的连接方式(1)一个信号可以与另一个信号相连,代码如下
:connect(Object1,SIGNAL(signal1),Object2,SIGNAL(signal1));表示Objec
t1的信号1发送可以触发Object2的信号1发送。(2)同一个信号可以与多个槽相连,代码如下:connect(Object1,S
IGNAL(signal2),Object2,SIGNAL(slot2));connect(Object1,SIGNAL(sign
al2),Object3,SIGNAL(slot1));(3)同一个槽可以响应多个信号,代码如下:connect(Object1,
SIGNAL(signal2),Object2,SIGNAL(slot2));connect(Object3,SIGNAL(sig
nal2),Object2,SIGNAL(slot2));但是,常用的连接方式为:connect(Object1,SIGNAL(s
ignal),Object2,SLOT(slot));其中,signal为对象Object1的信号,slot为对象Object2的
槽。1.信号与槽机制的连接方式在本书1.3.1节(通过设计器实现)实例中,在Qt应用程序的用户界面加入计算圆面积的“计算”按钮后,
应用程序并没有响应计算操作。这是因为程序还没有将相应的信号和槽关联起来。因此,为了响应用户的计算面积值的操作,需要将“计算”按钮发
送的单击信号QAbstractButton::clicked()和对话框QDialog的Dialog::on_countBtn_
clicked()槽关联起来,可以根据需要在槽函数中进行相应的操作。类似地,改变文本编辑框内容信号QLineEdit::text
Changed(QString)产生后与对话框QDialog的Dialog::on_radiusLineEdit_textCha
nged(constQString&arg1)槽关联起来。在本书1.3.2节(通过编写代码实现)实例中,将“显示对应圆的面积
”按钮发送的单击信号QAbstractButton::clicked()和对话框QDialog的Dialog::showArea(
)槽关联起来。类似地,改变文本编辑框内容信号QLineEdit::textChanged(QString)产生后也与对话框QDia
log的Dialog::showArea()槽关联起来。SIGNAL()和SLOT()是Qt定义的两个宏,它们返回其参数的C语言风
格的字符串(constchar)。因此,下面关联信号和槽的两个语句是等同的:connect(button,SIGNAL(cli
cked()),this,SLOT(showArea()));connect(button,"clicked()",this,
"showArea()");2.信号与槽机制的优点(1)类型安全。需要关联的信号和槽的签名必须是等同的,即信号的参数类型和参数个数
与接收该信号的槽的参数类型和参数个数相同。不过,一个槽的参数个数是可以少于信号的参数个数的,但缺少的参数必须是信号参数的最后一个或
几个参数。如果信号和槽的签名不符,编译器就会报错。(2)松散耦合。信号和槽机制减弱了Qt对象的耦合度。激发信号的Qt对象无须知道是
哪个对象的哪个槽需要接收它发出的信号,它只需做的是在适当的时间发送适当的信号就可以了,而不需要知道也不关心它的信号有没有被接收到,
更不需要知道是哪个对象的哪个槽接收到了信号。同样,对象的槽也不知道是哪些信号关联了自己,而一旦关联信号和槽,Qt就保证了适合的槽得
到了调用。即使关联的对象在运行时被删除,应用程序也不会崩溃。3.信号与槽机制的效率信号和槽机制增强了对象间通信的灵活性,然而,这也
损失了一些性能。同回调函数相比,信号和槽机制运行速度有些慢。通常,通过传递一个信号来调用槽函数会比直接调用非虚函数的运行速度慢10
倍。主要原因如下。(1)需要定位接收信号的对象。(2)安全地遍历所有的关联(如一个信号关联多个槽的情况)。(3)编组(marsha
l)/解组(unmarshal)传递的参数。(4)在多线程时,信号可能需要排队等待。02Qt5元对象系统Qt5元对象系统Qt?
5元对象系统提供了对象间的通信机制(信号和槽)、运行时类型信息和动态属性系统的支持,是标准C++的一个扩展,它使Qt能够更好地实现GUI图形用户界面编程。Qt?5的元对象系统不支持C++模板,尽管该模板扩展了标准C++的功能。但是,元对象系统提供了模板无法提供的一些特性。Qt?5元对象系统基于以下三个事实。(1)基类QObject:任何需要使用元对象系统功能的类必须继承自QObject。(2)Q_OBJECT宏:Q_OBJECT宏必须出现在类的私有声明区中,用于启动元对象的特性。(3)元对象编译器(Meta-ObjectCompiler,moc):为QObject子类实现元对象特性提供必要的代码实现。03布局管理器布局管理器在设计较复杂的GUI用户界面时,仅通过指定窗口部件的父子关系以期达到加载和排列窗口部件的方法是行不通的,最好的办法是使用Qt提供的布局管理器。QGridLayoutmainLayout=newQGridLayout(this); //(a)mainLayout->addWidget(label1,0,0);//(b)mainLayout->addWidget(lineEdit,0,1);mainLayout->addWidget(label2,1,0);mainLayout->addWidget(button,1,1);setLayout(mainLayout);//(c)其中,(a)QGridLayoutmainLayout=newQGridLayout(this):创建一个网格布局管理器对象mainLayout,并用this指出父窗口。(b)mainLayout->addWidget(…):分别将控件对象label1、lineEdit、label2和button放置在布局管理器中,还可以在创建布局管理器对象时不必指明父窗口。(c)QWidget::setLayout(…):将布局管理器添加到对应的窗口部件对象中。因为这里的主窗口就是父窗口,所以直接调用setLayout(mainLayout)即可。
献花(0)
+1
(本文系gdp8egnayq4...首藏)