Qt诺基亚官方中文教程L2 Qt的对象模型和信号槽概念

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

.Qt的对象模型和信号槽的概念QtinEducationThisworkisaChinesetranslationoftheoriginalQtEducationalTrainingMaterialspublishedbyNokia:©2010NokiaCorporationanditsSubsidiary(-ies).Nokia,QtandtheNokiaandQtlogosaretheregisteredtrademarksofNokiaCorporationinFinlandandothercountriesworldwide.ThistranslationwascreatedbyCommunicationandComputerNetworkLaboratoryofGuangdongProvince,SouthChinaUniversityofTechnology.©2010CommunicationandComputerNetworkLaboratoryofGuangdongProvince,SouthChinaUniversityofTechnology.TheenclosedQtEducationalTrainingMaterialsareprovidedundertheCreativeCommonsAttribution-Non-Commercial-ShareAlike2.5LicenseAgreement.Thefulllicensetextisavailablehere:此文档内容是由诺基亚公司发布的原创Qt教育培训文档的中文翻译:©2010诺基亚公司及其附属公司。Nokia(诺基亚),Qt以及Nokia与Qt商标是Nokia公司在芬兰和全球其他国家的注册商标。该翻译版本由华南理工大学广东省计算机网络重点实验室创造。©2010华南理工大学广东省计算机网络重点实验室本Qt教育培训材料依照署名-非商业性使用-相同方式共享2.5许可协议(CreativeCommonsAttribution-Non-Commercial-ShareAlike2.5LicenseAgreement)发布。完整的许可证文本可以在这里找到:。QObject类QObject是几乎所有Qt类和所有部件(widget)的基类。它包含很多组成Qt的机制事件信号和槽属性内存管理QObject类QObject是大部分Qt类的基类例外的例子是:类需要作为轻量级的类,例如图元(graphicalprimitives)。数据容器(QString,QList,QChar等)需要可复制的类,因为QObject类是无法被复制的。QObject类它们可以拥有一个名字(QObject::objectName)它们被放置在QObject实例的一个层次上它们可以有到其他QObject实例的联接例子:在运行时复制一个部件有意义吗?“QObject的实例是单独的!”元数据(Metadata)Qt用C++实现内省每一个QObject都有一个元对象元对象涉及:类名(QObject::className)继承(QObject::inherits)属性信号和槽普通信息(QObject::classInfo)元数据元数据通过元对象编译器(moc)在编译时组合在一起。sources*.cppexecutablesobjectfiles*.oheaders*.h普通的C++生成过程includescompileslinks元数据Metadata元数据通过元对象编译器(moc)在编译时组合在一起。moc从头文件里面获得数据。sources*.cppexecutablesobjectfiles*.oheaders*.hgeneratedmoc_*.cppQtC++生成过程includescompileslinkscompilesmocs元数据moc找什么?classMyClass:publicQObject{Q_OBJECTQ_CLASSINFO(author,JohnDoe)public:MyClass(constFoo&foo,QObject*parent=0);Foofoo()const;publicslots:voidsetFoo(constFoo&foo);signals:voidfooChanged(Foo);private:Foom_foo;};Qt关键字类的一般信息Q_OBJECT宏,通常是第一步首先确认该类继承自Qobject(可能是间接)内省(Introspection)类在运行时了解它们自己的信息对实现脚本和动态语言的绑定有很好的支持。if(object-inherits(QAbstractItemView)){QAbstractItemView*view=static_castQAbstractItemView*(widget);view-...enumCapitalsEnum{Oslo,Helsinki,Stockholm,Copenhagen};intindex=object-metaObject()-indexOfEnumerator(CapitalsEnum);object-metaObject()-enumerator(index)-key(object-capital());能够实现动态转换而不需要运行时类型检查(RTTI)例子:它可以将枚举值转换成更容易阅读和保存的字符串元对象了解细节属性(Properties)QObject有getter和setter函数属性命名策略:color,setColor对于布尔:isEnabled,setEnabledclassQLabel:publicQFrame{Q_OBJECTQ_PROPERTY(QStringtextREADtextWRITEsetText)public:QStringtext()const;publicslots:voidsetText(constQString&);};Setter,返回空,将值当成唯一参数Getter,常量,返回值,没有参数属性为什么使用setter函数?可以验证设置对可能的变化作出反应voidsetMin(intnewMin){if(newMinm_max){qWarning(IgnoringsetMin(%d)asminmax.,newMin);return;}...voidsetMin(intnewMin){...m_min=newMin;updateMinimum();}属性Properties为什么使用getter函数?间接的属性QSizesize()const{returnm_size;}intwidth()const{returnm_size.width();}属性Q_PROPERTY(typenameREADgetFunction[WRITEsetFunction][RESETresetFunction][NOTIFYnotifySignal][DESIGNABLEbool][SCRIPTABLEbool][STOREDbool][USERbool][CONSTANT][FINAL])使用属性直接获取通过元信息和属性系统在运行时发现属性QStringtext=label-text();label-setText(HelloWorld!);QStringtext=object-property(text).toString();object-setProperty(text,HelloWorld);intQMetaObject::propertyCount();QMetaPropertyQMetaObject::property(i);QMetaProperty::name/isConstant/isDesignable/read/write/...动态属性在运行时给对象增加属性可以用来“标识”对象,等等。boolret=object-setProperty(name,value);QObject::dynamicPropertyNames()const真:如果属性经过Q_PROPERTY定义假:如果只是动态增加返回一个动态属性的列表创建自定义属性classAngleObject:publicQObject{Q_OBJECTQ_PROPERTY(qrealangleREADangleWRITEsetAngle)public:AngleObject(qrealangle,QObject*parent=0);qrealangle()const;voidsetAngle(qreal);private:qrealm_angle;};宏,描述属性初始化值GetterSetter私有状态创建自定义属性AngleObject::AngleObject(qrealangle,QObject*parent):QObject(parent),m_angle(angle){}qrealAngleObject::angle()const{returnm_angle;}voidAngleObject::setAngle(qrealangle){m_angle=angle;doSomething();}初始化值Getter简单返回值。这里你可以计算复杂的值。更新内部状态,对变化作出反应。自定义属性-枚举classAngleObject:publicQObject{Q_OBJECTQ_ENUMS(AngleMode)Q_PROPERTY(AngleModeangleModeREAD...)public:enumAngleMode{Radians,Degrees};...};普通枚举声明。宏通知QtAngleMode是一个枚举类型。属性使用枚举作为类型。内存管理QObject可以有父对象和子对象当一个父对象被删除,它的子对象也同样被删除。QObject*parent=newQObject();QObject*child1=newQObject(parent);QObject*child2=newQObject(parent);QObject*child1_1=newQObject(child1);QObject*child1_2=newQObject(child1);deleteparent;parentchild1child2child1_1child1_2parent删除child1和child2child1删除child1_1和child1_2内存管理当需要实现视觉层级时使用到它。QDialog*parent=newQDialog();QGroupBox*box=newQGroupBox(parent);QPushButton*button=newQPushButton(parent);QRadioButton*option1=newQRadioButton(box);QRadioButton*option2=newQRadioButton(box);deleteparent;parent删除box和buttonbox删除option1和option2使用模式使用this指针指向最高层父对象在栈上分配父对象空间voidWidget::showDialog(){Dialogdialog;if(dialog.exec()==QDialog::Accepted){...}}Dialog::Dialog(QWidget*parent):QDialog(parent){QGroupBox*box=QGroupBox(this)

1 / 60
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功