Qt入门培训PPT课件

上传人:英*** 文档编号:77038910 上传时间:2022-04-19 格式:PPTX 页数:110 大小:2.73MB
收藏 版权申诉 举报 下载
Qt入门培训PPT课件_第1页
第1页 / 共110页
Qt入门培训PPT课件_第2页
第2页 / 共110页
Qt入门培训PPT课件_第3页
第3页 / 共110页
资源描述:

《Qt入门培训PPT课件》由会员分享,可在线阅读,更多相关《Qt入门培训PPT课件(110页珍藏版)》请在装配图网上搜索。

1、Qt简介Qt的使用Qt深入理解Qt的应用第1页/共110页Qt简介什么是Qt?第2页/共110页什么是Qt?原来用作用户界面开发,现可用作所有的开发例如:Databases, XML, WebKit, multimedia, networking, OpenGL, scripting, non-GUI.”Qt 是一个用C+编写的跨平台开发框架.”第3页/共110页什么是Qt?Qt由模块构建QtCorePhononQtXmlPatternsQtXmlQtWebKitQtSvgQtSqlQtScriptQtOpenVGQtOpenGLQtNetworkQtMultimediaQtGui第4页/共1

2、10页什么是QT?Qt用宏(macros)和内省(introspection)扩展了C+所有的代码仍然是简明C + +foreach (int value, intList) QObject *o = new QPustButton;o-metaObject()-className(); / 返回 ”QPushButton”connect(button, SIGNAL(clicked(), window, SLOT(close();第5页/共110页Qt的目的一次编写,到处编译根据不同平台的本地观感生成相应的本地应用简单地使用API,高开发效率,开放性,使用有趣第6页/共110页Qt的历史19

3、901991199419992001Haavard 和Eirik灵感闪现开始设计,并提出信号和槽的概念1993开发出Qt的第一个图形核心命名为Qt,并建立“奇趣科技”1995签订第一个合同,开始快速发展。1997Qt1.2发布, 并且用于开发KDE。Qt 2.0发布Qt 3.0发布。2005Qt 4.0发布2008Nokia收购奇趣科技第7页/共110页Qt的跨平台桌面平台WindowsMac OS XLinux/Unix X11第8页/共110页Qt的跨平台嵌入式平台Windows CESymbianMaemo嵌入式Linux第9页/共110页Qt的授权LGPL 免费你的应用程序可以是开源的

4、或者是不开源的对Qt的修改,必须反馈到社区GPL 免费你的应用程序必须是开源的对Qt的修改,必须反馈到社区商业的 收费你的应用程序可以是不开源 的对Qt的修改,可以不开源第10页/共110页Qt简介Qt的使用Qt深入理解Qt的应用第11页/共110页Qt的代码结构-Hello World第12页/共110页Qt的代码结构-Hello World#include #include int main( int argc, char *argv ) QApplication app( argc, argv ); QLabel l( Hello World! ); l.show(); return a

5、pp.exec();第13页/共110页Qt的代码结构-Hello World#include #include int main( int argc, char *argv ) QApplication app( argc, argv ); QLabel l( Hello World! ); l.show(); return app.exec();第14页/共110页Qt的代码结构-Hello World#include #include int main( int argc, char *argv ) QApplication app( argc, argv ); QLabel l( He

6、llo World! ); l.show(); return app.exec();第15页/共110页Qt的代码结构-Hello World#include #include int main( int argc, char *argv ) QApplication app( argc, argv ); QLabel l( Hello World! ); l.show(); return app.exec();第16页/共110页Qt的代码结构-Hello World#include #include int main( int argc, char *argv ) QApplication

7、 app( argc, argv ); QLabel l( Hello World! ); l.show(); return app.exec();第17页/共110页Qt开发工具集1. Qt Creator2. Qt Designer3. Qt Linguist4. Qt Assisant5. Qt Demos第18页/共110页信号(Signal)与槽(Slot)初探QT提供的一种在对象间进行通讯的技术。动态地或松散地将事件和状态变化联系起来。信号和槽机制是使Qt运作的元素。第19页/共110页信号(Signal)与槽(Slot)初探 类似于windows中的消息和消息响应都是通过C+类成

8、员函数实现的信号和槽是通过连接实现相互关联的包含信号或槽的类必须从QObject继承第20页/共110页信号(Signal)与槽(Slot)初探emit clicked();第21页/共110页信号(Signal)与槽(Slot)初探private slots: void on_addButton_clicked(); void on_deleteButton_clicked();connect(clearButton,SIGNAL(clicked(),listWidget,SLOT(clear();connect(addButton,SIGNAL(clicked(),this,SLOT(.)

9、;2xclear();第22页/共110页信号(Signal)与槽(Slot)初探 . emit clicked(); . . emit clicked(); . . emit clicked(); . QString newText = QInputDialog:getText(this, Enter text, Text:); if( !newText.isEmpty() ) ui-listWidget-addItem(newText); foreach (QListWidgetItem *item, ui-listWidget-selectedItems() delete item; c

10、lear();第23页/共110页信号(Signal)与槽(Slot)初探class Employee : public QObjectQ_OBJECTpublic:Employee();int salary() const;public slots:void setSalary(int newSalary);signals:void salaryChanged(int newSalary);private:int mySalary;emit salaryChanged(50);信号和槽的声明:第24页/共110页信号(Signal)与槽(Slot)初探第25页/共110页信号(Signal)

11、与槽(Slot)初探 信号与槽机制只能用在继承于QObject的类。槽可以返回值,但通过联接返回时不能有返回值,槽以一个普通的函数实现,可以作为普通函数调用。信号总是返回空,信号总是不必实现 一个信号可以连接到多个槽,但槽的调用顺序不确定。 信号和槽需要具有相同的参数列表;如果信号的参数比槽多,那么多余的参数会被忽略;如果参数列表不匹配,Qt会产生运行时错误信息第26页/共110页信号和槽 vs 回调回调(callback)是一个函数指针,当一个事件发生时被调用,任何函数都可以被安排作为回调。没有类型安全总是以直接调用方式工作信号和槽的方式更加动态一个更通用的机制更容易互连两个已存在的类相关类

12、之间涉及更少的知识共享第27页/共110页用户界面设计用户界面由特定的部件(widget)构建第28页/共110页用户界面设计三种方式1.绝对定位(absolute positioning )最粗劣的方式对部件的大小、位置进行硬编码2. 手工布局(manual layout) 绝对位置,但通过resizeEvent()方法改变大小3.布局管理器(layout managers)部件放置在布局管理器中,使界面更具弹性。第29页/共110页布局管理器的优点?让部件适应内容让部件适应翻译变化让部件适应用户设置第30页/共110页布局管理几种可用的布局布局管理器和部件“协商”各个部件大小与位置弹簧可以

13、用来填充空白处QGridLayoutQVBoxLayoutQHBoxLayout第31页/共110页布局管理器示例对话框由多层的布局管理器和部件组成两种方式:代码实现,使用设计器注意:布局管理器并不是其管理的部件的父对象第32页/共110页布局管理器代码实现 QVBoxLayout *outerLayout = new QVBoxLayout(this); QHBoxLayout *topLayout = new QHBoxLayout(); topLayout-addWidget(new QLabel(Printer:); topLayout-addWidget(c=new QComboBo

14、x(); outerLayout-addLayout(topLayout); QHBoxLayout *groupLayout = new QHBoxLayout(); . outerLayout-addLayout(groupLayout); outerLayout-addSpacerItem(new QSpacerItem(.); QHBoxLayout *buttonLayout = new QHBoxLayout(); buttonLayout-addSpacerItem(new QSpacerItem(.); buttonLayout-addWidget(new QPushButto

15、n(Print); buttonLayout-addWidget(new QPushButton(Cancel); outerLayout-addLayout(buttonLayout);第33页/共110页布局管理器代码实现 QVBoxLayout *outerLayout = new QVBoxLayout(this); QHBoxLayout *topLayout = new QHBoxLayout(); topLayout-addWidget(new QLabel(Printer:); topLayout-addWidget(c=new QComboBox(); outerLayout

16、-addLayout(topLayout); QHBoxLayout *groupLayout = new QHBoxLayout(); . outerLayout-addLayout(groupLayout); outerLayout-addSpacerItem(new QSpacerItem(.); QHBoxLayout *buttonLayout = new QHBoxLayout(); buttonLayout-addSpacerItem(new QSpacerItem(.); buttonLayout-addWidget(new QPushButton(Print); button

17、Layout-addWidget(new QPushButton(Cancel); outerLayout-addLayout(buttonLayout);第34页/共110页布局管理器代码实现 QVBoxLayout *outerLayout = new QVBoxLayout(this); QHBoxLayout *topLayout = new QHBoxLayout(); topLayout-addWidget(new QLabel(Printer:); topLayout-addWidget(c=new QComboBox(); outerLayout-addLayout(topLa

18、yout); QHBoxLayout *groupLayout = new QHBoxLayout(); . outerLayout-addLayout(groupLayout); outerLayout-addSpacerItem(new QSpacerItem(.); QHBoxLayout *buttonLayout = new QHBoxLayout(); buttonLayout-addSpacerItem(new QSpacerItem(.); buttonLayout-addWidget(new QPushButton(Print); buttonLayout-addWidget

19、(new QPushButton(Cancel); outerLayout-addLayout(buttonLayout);第35页/共110页布局管理器代码实现 QVBoxLayout *outerLayout = new QVBoxLayout(this); QHBoxLayout *topLayout = new QHBoxLayout(); topLayout-addWidget(new QLabel(Printer:); topLayout-addWidget(c=new QComboBox(); outerLayout-addLayout(topLayout); QHBoxLayo

20、ut *groupLayout = new QHBoxLayout(); . outerLayout-addLayout(groupLayout); outerLayout-addSpacerItem(new QSpacerItem(.); QHBoxLayout *buttonLayout = new QHBoxLayout(); buttonLayout-addSpacerItem(new QSpacerItem(.); buttonLayout-addWidget(new QPushButton(Print); buttonLayout-addWidget(new QPushButton

21、(Cancel); outerLayout-addLayout(buttonLayout);第36页/共110页布局管理器代码实现 QVBoxLayout *outerLayout = new QVBoxLayout(this); QHBoxLayout *topLayout = new QHBoxLayout(); topLayout-addWidget(new QLabel(Printer:); topLayout-addWidget(c=new QComboBox(); outerLayout-addLayout(topLayout); QHBoxLayout *groupLayout

22、= new QHBoxLayout(); . outerLayout-addLayout(groupLayout); outerLayout-addSpacerItem(new QSpacerItem(.); QHBoxLayout *buttonLayout = new QHBoxLayout(); buttonLayout-addSpacerItem(new QSpacerItem(.); buttonLayout-addWidget(new QPushButton(Print); buttonLayout-addWidget(new QPushButton(Cancel); outerL

23、ayout-addLayout(buttonLayout);第37页/共110页布局管理器代码实现 QHBoxLayout *groupLayout = new QHBoxLayout(); QGroupBox *orientationGroup = new QGroupBox(); QVBoxLayout *orientationLayout = new QVBoxLayout(orientationGroup); orientationLayout-addWidget(new QRadioButton(Landscape); orientationLayout-addWidget(new

24、QRadioButton(Portrait); groupLayout-addWidget(orientationGroup); QGroupBox *colorGroup = new QGroupBox(); QVBoxLayout *colorLayout = new QVBoxLayout(colorGroup); colorLayout-addWidget(new QRadioButton(Black and White); colorLayout-addWidget(new QRadioButton(Color); groupLayout-addWidget(colorGroup);

25、Horizontal box, 包含 group boxes, vertical boxes, radio buttons第38页/共110页布局管理器设计器可以使用设计器来建立同样的结构第39页/共110页通用部件 Qt包含针对所有情形的大量通用部件; 第三方控件,如QWT 自定义控件第40页/共110页尺寸(size)的策略布局管理器是在空间和其他布局管理器之间进行协调布局管理器提供布局结构水平布局和垂直布局网格布局部件则提供各个方向上的尺寸策略最大和最小尺寸第41页/共110页尺寸的策略例子未完成!printerList-setSizePolicy(QSizePolicy:Expandi

26、ng, QSizePolicy:Fixed)第42页/共110页尺寸的策略每一个widget有一个大小的示意,它给出了各个方向上尺寸的策略Fixed 规定了widget的尺寸Minimum 规定了可能的最小值Maximum 规定可能的最大值Preferred 给出最好的值但不是必须的Expanding 同preferred,但希望增长MinimumExpanding 同minimum,但希望增长Ignored 忽略规定尺寸, widget得到尽量大的空间第43页/共110页如果?2个 preferred 相邻1个 preferred, 1个 expanding2个 expanding 相邻空间

27、不足以放置widget (fixed)第44页/共110页关于尺寸的更多信息可用最大和最小属性更好地控制widget的大小maximumSize 最大可能尺寸minimumSize 最小可能尺寸ui-pushButton-setMinimumSize(100, 150);ui-pushButton-setMaximumHeight(250);第45页/共110页伸缩因子控制缩放时,各控件的缩放比例。第46页/共110页设计器介绍以前设计器(Designer)是一个独立的工具,但现在是QtCreator的一个组成部分可视化窗体编辑器拖放部件安排布局进行信号连接第47页/共110页设计器介绍sou

28、rces*.cppexecutablesobject files*.oheaders*.hgeneratedmoc_*.cppuser interfaces*.uiincludescompileslinkscompilesmocs第48页/共110页设计器介绍sources*.cppexecutablesobject files*.oheaders*.hgeneratedmoc_*.cppgeneratedui_*.huser interfaces*.uiincludescompileslinkscompilesmocsuic第49页/共110页使用代码#ifndef WIDGET_H#def

29、ine WIDGET_H#include namespace Ui class Widget;class Widget : public QWidget Q_OBJECTpublic: Widget(QWidget *parent = 0); Widget();private: Ui:Widget *ui;#endif / WIDGET_HUi:Widget类的前置声明一个 Ui:Widget 类指针ui ,指向所有部件基本上一个标准的 QWidget 派生类第50页/共110页使用代码#include widget.h#include ui_widget.hWidget:Widget(QWi

30、dget *parent) : QWidget(parent), ui(new Ui:Widget) ui-setupUi(this);Widget:Widget() delete ui;实例化类Ui:Widget 为 ui删除 ui对象调用函数 setupUi, 生成所有父窗体 (this)的子窗体部件第51页/共110页使用设计器基本工作流程 粗略地放置部件在窗体上 从里到外进行布局,添加必要的弹簧 进行信号连接 在代码中使用在整个过程中不断修改编辑属性实践创造完美!第52页/共110页使用设计器拖放部件拖放部件粗略地放置部件在窗体上第53页/共110页使用设计器从里到外进行布局,添加必要

31、的弹簧121. 选中每一个 group box, 2. 应用垂直布局管理第54页/共110页使用设计器从里到外进行布局,添加必要的弹簧11. 选中label (click), 2. 选中combobox (Ctrl+click)2第55页/共110页使用设计器从里到外进行布局,添加必要的弹簧11. 应用一个水平布局管理第56页/共110页使用设计器从里到外进行布局,添加必要的弹簧131. 选中2个group box并进行布局管理, 2. 添加一个水平弹簧, 3. 将弹簧和按钮放置进一个布局管理中2第57页/共110页使用设计器进行信号连接(部件之间)12341. 转到signals and s

32、lot 编辑模式, 2. 从一个部件拖放鼠标到另一个部件, 3. 选中signal and slot, 4. 在connections dock中查看结果第58页/共110页使用设计器进行信号连接(到你的代码中)1231. 在widget editing 模式中 2. 右击一个部件并选择 Go to slot.3. 选择一个信号来连接到你的代码第59页/共110页使用设计器在代码中使用通过ui类成员使用所有部件class Widget : public QWidget .private: Ui:Widget *ui;void Widget:memberFunction() ui-pushBut

33、ton-setText(.);第60页/共110页界面美化1.子类化已有的控件类,重新实现paintEvent()、MouseEvent()等方法;2.子类化QStyle,或者使用已经定义了的QWindowStyle等。3.使用StyleSheet。第61页/共110页样式表(StyleSheet)所有的 QWidget 类都有一个 styleSheet 属性以支持跨平台样式样式表是受启发自CSS的它们可以用来进行高亮处理并进行许多小的修改当然也可以用于用户界面的整体修改第62页/共110页样式表为一个单独的部件应用一个样式表的最简单方法是用设计器第63页/共110页样式表想为整个应用程序设定

34、样式,可以使用 QApplication:setStyleSheetQLineEdit background-color: yellow QLineEdit#nameEdit background-color: yellow QTextEdit, QListView background-color: white; background-image: url(draft.png); background-attachment: scroll; QGroupBox background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop

35、: 0 #E0E0E0, stop: 1 #FFFFFF); border: 2px solid gray; border-radius: 5px; margin-top: 1ex; 使用图片在Designer的编辑器中建立这些选择一个类通过对象名选择一个对象第64页/共110页资源文件(qrc)将图标放进一个资源文件中,Qt会将它们内嵌进可执行文件避免调用多文件不需要尝试确定每个特定安装风格下的图标的路径一切都巧妙地在软件构建系统中自适应避免部署的时候出现文件丢失的错误可以将任何东西添加进资源文件中,不仅仅是图标,但一般是不需要修改的文件。第65页/共110页资源文件(qrc)可以轻松的在Q

36、tCreator中管理资源文件在路径和文件名前添加 : 以使用资源或者简单地在设计器的列表中选择一个图标QPixmap pm(:/images/logo.png);第66页/共110页Qt的国际化1. 确保应用程序是可翻译的: 所用用户可见的字符串都使用tr()修饰 根据不同的目标语言加载不同的qm的文件。2. 即使应用程序目前不需要翻译,也应该为以后的需求留出余地。第67页/共110页Qt国际化步骤1.在代码中使用tr()修饰用户可见的字符串;2.lupdate提取需要翻译的字符串;TRANSLATIONS = spreadsheet_cn.ts spreadsheet_en.ts 3.使用

37、linguist工具翻译;4.在程序开始时加载正确的qm文件。第68页/共110页Qt国际化加载qm文件int main(int argc, char *argv) QApplication app(argc, argv); . QTranslator appTranslator; appTranslator.load(myapp_ + QLocale:system().name(), qmPath); app.installTranslator(&appTranslator); . return app.exec(); 第69页/共110页Qt国际化动态语言切换额外的工作:1.语言切换的途径

38、(菜单、按钮等);2.在统一的方法(RetranslateUI()内处理用户可见字符串,并在语言切换时调用该方法。3.实现changeEvent(QEvent *event) 方法void JournalView:changeEvent(QEvent *event) if (event-type() = QEvent:LanguageChange) retranslateUi(); QTableWidget:changeEvent(event); 第70页/共110页Qt简介Qt的使用Qt深入理解Qt的应用第71页/共110页QObject类QObject是几乎所有Qt类和所有部件(widge

39、t)的基类。它包含很多组成Qt的机制事件信号和槽属性内存管理第72页/共110页QObject类QObject 是大部分Qt 类的基类例外的例子是:类需要作为轻量级的类,例如图元(graphical primitives)-QPen、QBrush。数据容器(QString, QList, QChar等)需要可复制的类,因为QObject类是无法被复制的。第73页/共110页QObject类它们可以拥有一个名字 (QObject:objectName)addButton, lineEdit_Password.它们被放置在QObject实例的一个层次上它们可以有到其他 QObject 实例的联接“

40、QObject 的实例是单独的!”第74页/共110页对象数据存储(1) class Personprivate: string mszName; / 姓名 bool mbSex; / 性别 int mnAge; / 年龄;c+中定义数据变量的一般方法:第75页/共110页/ File name: person.h/ 声明私有数据成员类型struct PersonalDataPrivate; class Personpublic: Person (); / constructorvirtual Person (); / destructorvoid setAge(const int);int

41、getAge();private: PersonalDataPrivate* d;对象数据存储(2) Qt定义数据变量(Qt 2.x):/ File name: person.cppstruct PersonalDataPrivate / 定义私有数据成员类型 string mszName; / 姓名 bool mbSex; / 性别 int mnAge; / 年龄;/ constructorPerson:Person () d = new PersonalDataPrivate;/ destructorPerson:Person () delete d;void Person:setAge(

42、const int age) if (age != d-mnAge) d-mnAge = age;int Person:getAge() return d-mnAge;第76页/共110页元对象系统(Meta-Object System) QObject 类 作为每一个需要利用元对象系统的类的基类。 Q_OBJECT 宏, 定义在每一个类的私有数据段,用来启用元对象功能,比如,动态属性,信号和槽。 元对象编译器moc (the Meta Object Complier)第77页/共110页元对象系统(Meta-Object System)元对象系统的功能:元数据(QObject:metaObj

43、ect)类名 (QObject:className)继承 (QObject:inherits)属性(setProperty和 QObject:property)信号和槽(Signal and slot)普通信息(QObject:classInfo)国际化(tr(), QObject:trUtf8()第78页/共110页元对象系统(Meta-Object System)sources*.cppexecutablesobject files*.oheaders*.h普通的普通的C+生成过程生成过程includescompileslinks第79页/共110页元数据通过元对象编译器(moc)在编译时

44、组合在一起,元对象编译器用来处理Qt 的C+扩展。 moc从头文件里面获得数据。sources*.cppexecutablesobject files*.oheaders*.hgeneratedmoc_*.cppQt C+ 生成过程生成过程includescompileslinkscompilesmocs元对象系统(Meta-Object System)第80页/共110页元数据moc 找什么?class MyClass : public QObject Q_OBJECT Q_CLASSINFO(author, John Doe)public: MyClass(const Foo &foo,

45、QObject *parent=0); Foo foo() const;public slots: void setFoo( const Foo &foo );signals: void fooChanged( Foo );private: Foo m_foo;Qt 关键字类的一般信息 Q_OBJECT宏, 通常是第一步首先确认该类继承自 Qobject (可能是间接)第81页/共110页内省(Introspection)类在运行时了解它们自己的信息对实现脚本和动态语言的绑定 有很好的支持。if (object-inherits(QAbstractItemView) QAbstractItem

46、View *view = static_cast(widget); view-.enum CapitalsEnum Oslo, Helsinki, Stockholm, Copenhagen ;int index = object-metaObject()-indexOfEnumerator(CapitalsEnum);object-metaObject()-enumerator(index)-key(object-capital();能够实现动态转换而不需要运行时类型检查( RTTI)例子:它可以将枚举值转换成更容易阅读和保存的字符串元对象了解细节第82页/共110页属性(Propertie

47、s)QObject有getter和setter函数属性命名策略: color, setColor对于布尔: isEnabled, setEnabledclass QLabel : public QFrame Q_OBJECT Q_PROPERTY(QString text READ text WRITE setText)public: QString text() const;public slots: void setText(const QString &);Setter, 返回空,将值当成唯一参数Getter, 常量,返回值,没有参数第83页/共110页属性为什么使用setter 函数?

48、可以验证设置对可能的变化作出反应void setMin( int newMin ) if( newMin m_max ) qWarning(Ignoring setMin(%d) as min max., newMin); return; .void setMin( int newMin ) . m_min = newMin; updateMinimum();第84页/共110页属性Properties为什么使用getter 函数?间接的属性QSize size() const return m_size;int width() const return m_size.width();第85页

49、/共110页属性 Q_PROPERTY(type name READ getFunction WRITE setFunction RESET resetFunction NOTIFY notifySignal DESIGNABLE bool SCRIPTABLE bool STORED bool USER bool CONSTANT FINAL)第86页/共110页使用属性直接获取通过元信息和属性系统在运行时发现属性QString text = label-text();label-setText(Hello World!);QString text = object-property(tex

50、t).toString();object-setProperty(text, Hello World);int QMetaObject:propertyCount();QMetaProperty QMetaObject:property(i);QMetaProperty:name/isConstant/isDesignable/read/write/.第87页/共110页动态属性在运行时给对象增加属性可以用来“标识”对象,等等。bool ret = object-setProperty(name, value);QObject:dynamicPropertyNames() const真:如果属

51、性经过真:如果属性经过Q_PROPERTY 定义 假:如果只是动态增加假:如果只是动态增加返回一个动态属性的列表第88页/共110页创建自定义属性class AngleObject : public QObject Q_OBJECT Q_PROPERTY(qreal angle READ angle WRITE setAngle)public: AngleObject(qreal angle, QObject *parent = 0); qreal angle() const; void setAngle(qreal);private: qreal m_angle;宏,描述属性初始化值Gett

52、erSetter私有状态第89页/共110页创建自定义属性AngleObject:AngleObject(qreal angle, QObject *parent) : QObject(parent), m_angle(angle)qreal AngleObject:angle() const return m_angle;void AngleObject:setAngle(qreal angle) m_angle = angle; doSomething();初始化值Getter 简单返回值。这里你可以计算复杂的值。更新内部状态, 对变化作出反应。第90页/共110页自定义属性 - 枚举cl

53、ass AngleObject : public QObject Q_OBJECT Q_ENUMS(AngleMode) Q_PROPERTY(AngleMode angleMode READ .)public: enum AngleMode Radians, Degrees; .;普通枚举声明。宏通知Qt AngleMode 是一个枚举类型。属性使用枚举作为类型。第91页/共110页内存管理QObject 可以有父对象和子对象当一个父对象被删除,它的子对象也同样被删除。QObject *parent = new QObject();QObject *child1 = new QObject(

54、parent);QObject *child2 = new QObject(parent);QObject *child1_1 = new QObject(child1);QObject *child1_2 = new QObject(child1);delete parent;parentchild1child2child1_1child1_2parent 删除 child1 和 child2child1 删除 child1_1 和 child1_2第92页/共110页内存管理当需要实现视觉层级时使用到它。QDialog *parent = new QDialog();QGroupBox *

55、box = new QGroupBox(parent);QPushButton *button = new QPushButton(parent);QRadioButton *option1 = new QRadioButton(box);QRadioButton *option2 = new QRadioButton(box);delete parent;parent 删除 box 和 buttonbox 删除 option1 和 option2第93页/共110页使用方法使用 this指针指向最高层父对象在栈上分配父对象空间void Widget:showDialog() Dialog d

56、ialog; if (dialog.exec() = QDialog:Accepted) . Dialog:Dialog(QWidget *parent) : QDialog(parent) QGroupBox *box = QGroupBox(this); QPushButton *button = QPushButton(this); QRadioButton *option1 = QRadioButton(box); QRadioButton *option2 = QRadioButton(box); .dialog 在作用范围结束时被删除第94页/共110页堆(Heap)当使用 new

57、 和 delete时, 内存在堆中分配。堆内存空间必须通过 delete 完全释放,以防止内存泄漏。只要有需要,分配在堆上的对象可以一直存活下去。newdelete构造构造Construction析构析构Destruction第95页/共110页栈(Stack)局部变量在栈上分配。栈变量超过作用范围时会自动释放。分配在栈中的对象在超出作用范围时总是会被析构。int a构造构造Construction析构析构Destruction第96页/共110页堆 和 栈想要自动内存管理,只有父对象需要在栈上分配。MyMainWindowQApplicationint main(int argc, char

58、 *argv) QApplication a(argc, argv); MyMainWindow w; w.show(); return a.exec();MyMainWindow:MyMainWindow(. new QLabel(this); new .第97页/共110页改变所有者QObject可以修改它所属的父对象。父对象知道何时子对象被删除一系列函数实现返回指针,从其所有者“拿走”释放的数据,把它留给拿取者处理obj-setParent(newParent);delete listWidget-item(0); / 删除第一个item(不安全)QLayoutItem *QLayout

59、:takeAt(int);QListWidgetItem *QListWidget:takeItem(int);/ Safe alternativeQListWidgetItem *item = listWidget-takeItem(0);if (item) delete item; item列表本质上并不是子对象,而是拥有者。 这个例子进行了说明。第98页/共110页构造规范几乎所有的 QObject 都有一个默认为空值的父对象。Qwidget 的父对象是其它 QWidget类为了方便,倾向于提供多种构造(包括只带有父对象的一种)父对象通常是带缺省值的第一个参数。 QLabel(const

60、 QString &text, QWidget *parent=0, Qt:WindowFlags f=0);QObject(QObject *parent=0);QPushButton(QWidget *parent=0);QPushButton(const QString &text, QWidget *parent=0);QPushButton(const QIcon &icon, const QString &text, QWidget *parent=0);第99页/共110页构造规范当创建自己的 Qobject时, 需考虑总是允许父对象 parent 为 0 (null)有一个只接

61、受父对象的构造函数parent 是带默认值的第一个参数提供几种构造函数,避免空值、无效值(e.g. QString()作为参数。第100页/共110页Qt简介Qt的使用Qt深入理解Qt的应用第101页/共110页基于Qt开发的软件KDE(1)第102页/共110页基于Qt开发的软件KDE(2)第103页/共110页基于Qt开发的软件Google Earth第104页/共110页基于Qt开发的软件MAYA第105页/共110页基于Qt开发的软件-大吨位力矩限制器第106页/共110页基于Qt开发的软件-塔机智能监控系统第107页/共110页Qt资源推荐1.C+ GUI Programming with Qt 4, Second Edition,Prentice Hall 2.Qt AssisantQt帮助文档3.Qt Demo第108页/共110页结结束束不不是是是开是开始始第109页/共110页感谢您的观看!第110页/共110页

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!