NOKIA_QT培训资料(中文版).ppt
《NOKIA_QT培训资料(中文版).ppt》由会员分享,可在线阅读,更多相关《NOKIA_QT培训资料(中文版).ppt(60页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、.Qt的对象模型和信号槽的概念QtinEducation2021/9/261ThisworkisaChinesetranslationoftheoriginalQtEducationalTrainingMaterialspublishedbyNokia:2010NokiaCorporationanditsSubsidiary(-ies).Nokia,QtandtheNokiaandQtlogosaretheregisteredtrademarksofNokiaCorporationinFinlandandothercountriesworldwide.Thistranslationwascre
2、atedbyCommunicationandComputerNetworkLaboratoryofGuangdongProvince,SouthChinaUniversityofTechnology.2010CommunicationandComputerNetworkLaboratoryofGuangdongProvince,SouthChinaUniversityofTechnology.TheenclosedQtEducationalTrainingMaterialsareprovidedundertheCreativeCommonsAttribution-Non-Commercial-
3、ShareAlike2.5LicenseAgreement.Thefulllicensetextisavailablehere:http:/creativecommons.org/licenses/by-nc-sa/2.5/legalcode.此文档内容是由诺基亚公司发布的原创Qt教育培训文档的中文翻译:2010诺基亚公司及其附属公司。Nokia(诺基亚),Qt以及Nokia与Qt商标是Nokia公司在芬兰和全球其他国家的注册商标。该翻译版本由华南理工大学广东省计算机网络重点实验室创造。2010华南理工大学广东省计算机网络重点实验室本Qt教育培训材料依照署名-非商业性使用-相同方式共享2.5许
4、可协议(CreativeCommonsAttribution-Non-Commercial-ShareAlike2.5LicenseAgreement)发布。完整的许可证文本可以在这里找到:http:/creativecommons.org/licenses/by-nc-sa/2.5/legalcode。2021/9/262QObject类QObject是几乎所有Qt类和所有部件(widget)的基类。它包含很多组成Qt的机制事件信号和槽属性内存管理2021/9/263QObject类QObject是大部分Qt类的基类例外的例子是:类需要作为轻量级的类,例如图元(graphicalprimit
5、ives)。数据容器(QString,QList,QChar等)需要可复制的类,因为QObject类是无法被复制的。2021/9/264QObject类它们可以拥有一个名字(QObject:objectName)它们被放置在QObject实例的一个层次上它们可以有到其他QObject实例的联接例子:在运行时复制一个部件有意义吗?“QObject 的实例是单独的!”2021/9/265元数据(Metadata)Qt用C+实现内省每一个QObject都有一个元对象元对象涉及:类名(QObject:className)继承(QObject:inherits)属性信号和槽普通信息(QObject:cl
6、assInfo)2021/9/266元数据元数据通过元对象编译器(moc)在编译时组合在一起。sources*.cppexecutablesobjectfiles*.oheaders*.h普通的普通的C+生成过程生成过程includescompileslinks2021/9/267元数据Metadata元数据通过元对象编译器(moc)在编译时组合在一起。moc从头文件里面获得数据。sources*.cppexecutablesobjectfiles*.oheaders*.hgeneratedmoc_*.cppQt C+生成过程生成过程includescompileslinkscompilesm
7、ocs2021/9/268元数据moc找什么?classMyClass:publicQObjectQ_OBJECT Q_CLASSINFO(author,John Doe)public:MyClass(constFoo&foo,QObject*parent=0);Foofoo()const;publicslots:voidsetFoo(constFoo&foo);signals:voidfooChanged(Foo);private:Foom_foo;Qt关键字类的一般信息Q_OBJECT宏,通常是第一步首先确认该类继承自Qobject(可能是间接)2021/9/269内省(Introspec
8、tion)类在运行时了解它们自己的信息对实现脚本和动态语言的绑定有很好的支持。if(object-inherits(QAbstractItemView)QAbstractItemView*view=static_cast(widget);view-.enumCapitalsEnumOslo,Helsinki,Stockholm,Copenhagen;intindex=object-metaObject()-indexOfEnumerator(CapitalsEnum);object-metaObject()-enumerator(index)-key(object-capital();能够实现
9、动态转换而不需要运行时类型检查(RTTI)例子:它可以将枚举值转换成更容易阅读和保存的字符串元对象了解细节2021/9/2610属性(Properties)QObject有getter和setter函数属性命名策略:color,setColor对于布尔:isEnabled,setEnabledclassQLabel:publicQFrameQ_OBJECTQ_PROPERTY(QStringtextREADtextWRITEsetText)public:QStringtext()const;publicslots:voidsetText(constQString&);Setter,返回空,将值
10、当成唯一参数Getter,常量,返回值,没有参数2021/9/2611属性为什么使用setter函数?可以验证设置对可能的变化作出反应voidsetMin(intnewMin)if(newMinm_max)qWarning(IgnoringsetMin(%d)asminmax.,newMin);return;.voidsetMin(intnewMin).m_min=newMin;updateMinimum();2021/9/2612属性Properties为什么使用getter函数?间接的属性QSizesize()constreturnm_size;intwidth()constreturnm
11、_size.width();2021/9/2613属性Q_PROPERTY(typenameREADgetFunctionWRITEsetFunctionRESETresetFunctionNOTIFYnotifySignalDESIGNABLEboolSCRIPTABLEboolSTOREDboolUSERboolCONSTANTFINAL)2021/9/2614使用属性直接获取通过元信息和属性系统在运行时发现属性QStringtext=label-text();label-setText(HelloWorld!);QStringtext=object-property(text).toSt
12、ring();object-setProperty(text,HelloWorld);intQMetaObject:propertyCount();QMetaPropertyQMetaObject:property(i);QMetaProperty:name/isConstant/isDesignable/read/write/.2021/9/2615动态属性在运行时给对象增加属性可以用来“标识”对象,等等。boolret=object-setProperty(name,value);QObject:dynamicPropertyNames()const真:如果属性经过真:如果属性经过Q_PR
13、OPERTY定义假:如果只是动态增加假:如果只是动态增加返回一个动态属性的列表2021/9/2616创建自定义属性classAngleObject:publicQObjectQ_OBJECTQ_PROPERTY(qrealangleREADangleWRITEsetAngle)public:AngleObject(qrealangle,QObject*parent=0);qrealangle()const;voidsetAngle(qreal);private:qrealm_angle;宏,描述属性初始化值GetterSetter私有状态2021/9/2617创建自定义属性AngleObjec
14、t:AngleObject(qrealangle,QObject*parent):QObject(parent),m_angle(angle)qrealAngleObject:angle()constreturnm_angle;voidAngleObject:setAngle(qrealangle)m_angle=angle;doSomething();初始化值Getter简单返回值。这里你可以计算复杂的值。更新内部状态,对变化作出反应。2021/9/2618自定义属性-枚举classAngleObject:publicQObjectQ_OBJECTQ_ENUMS(AngleMode)Q_PR
15、OPERTY(AngleModeangleModeREAD.)public:enumAngleModeRadians,Degrees;.;普通枚举声明。宏通知QtAngleMode是一个枚举类型。属性使用枚举作为类型。2021/9/2619内存管理QObject可以有父对象和子对象当一个父对象被删除,它的子对象也同样被删除。QObject*parent=newQObject();QObject*child1=newQObject(parent);QObject*child2=newQObject(parent);QObject*child1_1=newQObject(child1);QObje
16、ct*child1_2=newQObject(child1);deleteparent;parentchild1child2child1_1child1_2parent删除child1和child2child1删除child1_1和child1_22021/9/2620内存管理当需要实现视觉层级时使用到它。QDialog*parent=newQDialog();QGroupBox*box=newQGroupBox(parent);QPushButton*button=newQPushButton(parent);QRadioButton*option1=newQRadioButton(box)
17、;QRadioButton*option2=newQRadioButton(box);deleteparent;parent删除box和buttonbox删除option1和option22021/9/2621使用模式使用this指针指向最高层父对象在栈上分配父对象空间voidWidget:showDialog()Dialogdialog;if(dialog.exec()=QDialog:Accepted).Dialog:Dialog(QWidget*parent):QDialog(parent)QGroupBox*box=QGroupBox(this);QPushButton*button=
18、QPushButton(this);QRadioButton*option1=QRadioButton(box);QRadioButton*option2=QRadioButton(box);.dialog在作用范围结束时被删除2021/9/2622堆(Heap)当使用new和delete时,内存在堆中分配。堆内存空间必须通过delete完全释放,以防止内存泄漏。只要有需要,分配在堆上的对象可以一直存活下去。newdelete构造构造Construction析构析构Destruction2021/9/2623栈(Stack)局部变量在栈上分配。栈变量超过作用范围时会自动释放。分配在栈中的对象在
19、超出作用范围时总是会被析构。inta构造构造Construction析构析构Destruction2021/9/2624堆和栈想要自动内存管理,只有父对象需要在栈上分配。MyMainWindowQApplicationintmain(intargc,char*argv)QApplicationa(argc,argv);MyMainWindoww;w.show();returna.exec();MyMainWindow:MyMainWindow(.newQLabel(this);new.2021/9/2625改变所有者QObject可以修改它所属的父对象。父对象知道何时子对象被删除一系列函数实现
20、返回指针,从其所有者“拿走”释放的数据,把它留给拿取者处理obj-setParent(newParent);deletelistWidget-item(0);/删除第一个item(不安全)QLayoutItem*QLayout:takeAt(int);QListWidgetItem*QListWidget:takeItem(int);/SafealternativeQListWidgetItem*item=listWidget-takeItem(0);if(item)deleteitem;item列表本质上并不是子对象,而是拥有者。这个例子进行了说明。2021/9/2626构造规范几乎所有的Q
21、Object都有一个默认为空值的父对象。Qwidget的父对象是其它QWidget类为了方便倾向于提供多种构造(包括只带有父对象的一种)父对象通常是带缺省值的第一个参数。QLabel(constQString&text,QWidget*parent=0,Qt:WindowFlagsf=0);QObject(QObject*parent=0);QPushButton(QWidget*parent=0);QPushButton(constQString&text,QWidget*parent=0);QPushButton(constQIcon&icon,constQString&text,QWid
22、get*parent=0);2021/9/2627构造规范当创建自己的Qobject时,需考虑总是允许父对象parent为0(null)有一个只接受父对象的构造函数parent是带默认值的第一个参数提供几种构造函数,避免空值、无效值(e.g.QString()作为参数。2021/9/2628休息2021/9/2629信号(signal)和槽(slot)通过反馈的方式动态地或松散地将事件和状态变化联系起来。是什么使Qt运作?2021/9/2630动作中的信号和槽emitclicked();2021/9/2631动作中的信号和槽privateslots:voidon_addButton_click
23、ed();voidon_deleteButton_clicked();connect(clearButton,SIGNAL(clicked(),listWidget,SLOT(clear();connect(addButton,SIGNAL(clicked(),this,SLOT(.);2xclear();2021/9/2632动作中的信号和槽.emitclicked();.emitclicked();.emitclicked();.QStringnewText=QInputDialog:getText(this,Entertext,Text:);if(!newText.isEmpty()ui
24、-listWidget-addItem(newText);foreach(QListWidgetItem*item,ui-listWidget-selectedItems()deleteitem;clear();2021/9/2633信号和槽vs回调回调(callback)是一个函数指针,当一个事件发生时被调用,任何函数都可以被安排作为回调。没有类型安全总是以直接调用方式工作信号和槽的方式更加动态一个更通用的机制更容易互连两个已存在的类相关类之间涉及更少的知识共享2021/9/2634什么是槽?槽在各种槽段(section)中定义。槽可以返回值,但并不是通过联接。任何数量的信号可以关联到一个槽
25、。它以一个普通的函数实现。它可以作为普通函数被调用。publicslots:voidaPublicSlot();protectedslots:voidaProtectedSlot();privateslots:voidaPrivateSlot();connect(src,SIGNAL(sig(),dest,SLOT(slt();2021/9/2635什么是信号?信号在信号段(section)中定义信号总是返回空信号总是不必实现由moc来提供实现信号可以关联到任意数量的槽上通常产生一个直接调用,但是可以在线程之间作为事件来传递,甚至可以用在套接字之间(使用第三方类)槽能以任意次序被激发信号使用e
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- NOKIA_QT 培训资料 中文版
限制150内