Qt入门培训课件

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

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

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

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

3、rd 和Eirik灵感闪现开始设计,并提出信号和槽的概念1993开发出Qt的第一个图形核心命名为Qt,并建立“奇趣科技”1995签订第一个合同,开始快速发展。1997Qt1.2发布,并且用于开发KDE。Qt 2.0发布Qt 3.0发布。2005Qt 4.0发布2008Nokia收购奇趣科技-Qt的跨平台的跨平台桌面平台桌面平台lWindowslMac OS XlLinux/Unix X11-Qt的跨平台的跨平台嵌入式平台嵌入式平台lWindows CElSymbianlMaemol嵌入式Linux-Qt的授权lLGPL 免费l你的应用程序可以是开源的或者是不开源的l对Qt的修改,必须反馈到社区

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

5、clude int main(int argc,char*argv)QApplication app(argc,argv);QLabel l(Hello World!);l.show();return app.exec();-Qt的代码结构的代码结构-Hello World#include#include int main(int argc,char*argv)QApplication app(argc,argv);QLabel l(Hello World!);l.show();return app.exec();-Qt的代码结构的代码结构-Hello World#include#includ

6、e int main(int argc,char*argv)QApplication app(argc,argv);QLabel l(Hello World!);l.show();return app.exec();-Qt的代码结构的代码结构-Hello World#include#include int main(int argc,char*argv)QApplication app(argc,argv);QLabel l(Hello World!);l.show();return app.exec();-Qt开发工具集开发工具集1.Qt Creator2.Qt Designer3.Qt L

7、inguist4.Qt Assisant5.Qt Demos-信号信号(Signal)与槽与槽(Slot)初探初探lQT提供的一种在对象间进行通讯的技术。l动态地或松散地将事件和状态变化联系起来。l信号和槽机制是使Qt运作的元素。-信号信号(Signal)与槽与槽(Slot)初探初探 类似于windows中的消息和消息响应都是通过C+类成员函数实现的信号和槽是通过连接实现相互关联的包含信号或槽的类必须从QObject继承-信号信号(Signal)与槽与槽(Slot)初探初探emit clicked();-信号(Signal)与槽(Slot)初探private slots:void on_add

8、Button_clicked();void on_deleteButton_clicked();connect(clearButton,SIGNAL(clicked(),listWidget,SLOT(clear();connect(addButton,SIGNAL(clicked(),this,SLOT(.);2xclear();-信号信号(Signal)与槽与槽(Slot)初探初探 .emit clicked();.emit clicked();.emit clicked();.QString newText=QInputDialog:getText(this,Enter text,Tex

9、t:);if(!newText.isEmpty()ui-listWidget-addItem(newText);foreach(QListWidgetItem*item,ui-listWidget-selectedItems()delete item;clear();-信号信号(Signal)与槽与槽(Slot)初探初探class Employee:public QObjectQ_OBJECTpublic:Employee();int salary()const;public slots:void setSalary(int newSalary);signals:void salaryChan

10、ged(int newSalary);private:int mySalary;emit salaryChanged(50);信号和槽的声明:-信号信号(Signal)与槽与槽(Slot)初探初探-信号信号(Signal)与槽与槽(Slot)初探初探l 信号与槽机制只能用在继承于QObject的类。l槽可以返回值,但通过联接返回时不能有返回值,槽以一个普通的函数实现,可以作为普通函数调用。l信号总是返回空,信号总是不必实现l 一个信号可以连接到多个槽,但槽的调用顺序不确定。l 信号和槽需要具有相同的参数列表;如果信号的参数比槽多,那么多余的参数会被忽略;如果参数列表不匹配,Qt会产生运行时错误

11、信息-信号和槽 vs 回调回调(callback)是一个函数指针,当一个事件发生时被调用,任何函数都可以被安排作为回调。没有类型安全总是以直接调用方式工作信号和槽的方式更加动态一个更通用的机制更容易互连两个已存在的类相关类之间涉及更少的知识共享-用户界面设计用户界面设计l用户界面由特定的部件(widget)构建-用户界面设计用户界面设计三种方式三种方式l1.绝对定位(absolute positioning)l最粗劣的方式l对部件的大小、位置进行硬编码l2.手工布局(manual layout)l绝对位置,但通过resizeEvent()方法改变大小l3.布局管理器(layout manage

12、rs)l部件放置在布局管理器中,使界面更具弹性。-布局管理器的优点?l让部件适应内容l让部件适应翻译变化l让部件适应用户设置-布局管理l几种可用的布局l布局管理器和部件“协商”各个部件大小与位置l弹簧可以用来填充空白处QGridLayoutQVBoxLayoutQHBoxLayout-布局管理器示例布局管理器示例l对话框由多层的布局管理器和部件组成l两种方式:代码实现,使用设计器注意:布局管理器并不是其管理的部件的父对象-布局管理器代码实现 QVBoxLayout*outerLayout=new QVBoxLayout(this);QHBoxLayout*topLayout=new QHBox

13、Layout();topLayout-addWidget(new QLabel(Printer:);topLayout-addWidget(c=new QComboBox();outerLayout-addLayout(topLayout);QHBoxLayout*groupLayout=new QHBoxLayout();.outerLayout-addLayout(groupLayout);outerLayout-addSpacerItem(new QSpacerItem(.);QHBoxLayout*buttonLayout=new QHBoxLayout();buttonLayout-

14、addSpacerItem(new QSpacerItem(.);buttonLayout-addWidget(new QPushButton(Print);buttonLayout-addWidget(new QPushButton(Cancel);outerLayout-addLayout(buttonLayout);-布局管理器代码实现 QVBoxLayout*outerLayout=new QVBoxLayout(this);QHBoxLayout*topLayout=new QHBoxLayout();topLayout-addWidget(new QLabel(Printer:);

15、topLayout-addWidget(c=new QComboBox();outerLayout-addLayout(topLayout);QHBoxLayout*groupLayout=new QHBoxLayout();.outerLayout-addLayout(groupLayout);outerLayout-addSpacerItem(new QSpacerItem(.);QHBoxLayout*buttonLayout=new QHBoxLayout();buttonLayout-addSpacerItem(new QSpacerItem(.);buttonLayout-addW

16、idget(new QPushButton(Print);buttonLayout-addWidget(new QPushButton(Cancel);outerLayout-addLayout(buttonLayout);-布局管理器布局管理器代码实现代码实现 QVBoxLayout*outerLayout=new QVBoxLayout(this);QHBoxLayout*topLayout=new QHBoxLayout();topLayout-addWidget(new QLabel(Printer:);topLayout-addWidget(c=new QComboBox();out

17、erLayout-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);buttonLayout

18、-addWidget(new QPushButton(Cancel);outerLayout-addLayout(buttonLayout);-布局管理器布局管理器代码实现代码实现 QVBoxLayout*outerLayout=new QVBoxLayout(this);QHBoxLayout*topLayout=new QHBoxLayout();topLayout-addWidget(new QLabel(Printer:);topLayout-addWidget(c=new QComboBox();outerLayout-addLayout(topLayout);QHBoxLayout

19、*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(Cancel);outerL

20、ayout-addLayout(buttonLayout);-布局管理器布局管理器代码实现代码实现 QVBoxLayout*outerLayout=new QVBoxLayout(this);QHBoxLayout*topLayout=new QHBoxLayout();topLayout-addWidget(new QLabel(Printer:);topLayout-addWidget(c=new QComboBox();outerLayout-addLayout(topLayout);QHBoxLayout*groupLayout=new QHBoxLayout();.outerLayo

21、ut-addLayout(groupLayout);outerLayout-addSpacerItem(new QSpacerItem(.);QHBoxLayout*buttonLayout=new QHBoxLayout();buttonLayout-addSpacerItem(new QSpacerItem(.);buttonLayout-addWidget(new QPushButton(Print);buttonLayout-addWidget(new QPushButton(Cancel);outerLayout-addLayout(buttonLayout);-布局管理器布局管理器

22、代码实现代码实现 QHBoxLayout*groupLayout=new QHBoxLayout();QGroupBox*orientationGroup=new QGroupBox();QVBoxLayout*orientationLayout=new QVBoxLayout(orientationGroup);orientationLayout-addWidget(new QRadioButton(Landscape);orientationLayout-addWidget(new QRadioButton(Portrait);groupLayout-addWidget(orientati

23、onGroup);QGroupBox*colorGroup=new QGroupBox();QVBoxLayout*colorLayout=new QVBoxLayout(colorGroup);colorLayout-addWidget(new QRadioButton(Black and White);colorLayout-addWidget(new QRadioButton(Color);groupLayout-addWidget(colorGroup);lHorizontal box,包含 group boxes,vertical boxes,radio buttons-布局管理器布

24、局管理器设计器设计器l可以使用设计器来建立同样的结构-通用部件通用部件l Qt包含针对所有情形的大量通用部件;l 第三方控件,如QWTl 自定义控件-尺寸(尺寸(size)的策略)的策略l布局管理器是在空间和其他布局管理器之间进行协调l布局管理器提供布局结构l水平布局和垂直布局l网格布局l部件则提供l各个方向上的尺寸策略l最大和最小尺寸-尺寸的策略尺寸的策略l例子未完成!printerList-setSizePolicy(QSizePolicy:Expanding,QSizePolicy:Fixed)-尺寸的策略尺寸的策略l每一个widget有一个大小的示意,它给出了各个方向上尺寸的策略lFi

25、xed 规定了widget的尺寸lMinimum 规定了可能的最小值lMaximum 规定可能的最大值lPreferred 给出最好的值但不是必须的lExpanding 同preferred,但希望增长lMinimumExpanding 同minimum,但希望增长lIgnored 忽略规定尺寸,widget得到尽量大的空间-如果如果?l2个 preferred 相邻l1个 preferred,1个 expandingl2个 expanding 相邻l空间不足以放置widget(fixed)-关于尺寸的更多信息关于尺寸的更多信息l可用最大和最小属性更好地控制widget的大小lmaximumS

26、ize 最大可能尺寸lminimumSize 最小可能尺寸ui-pushButton-setMinimumSize(100,150);ui-pushButton-setMaximumHeight(250);-伸缩因子伸缩因子l控制缩放时,各控件的缩放比例。-设计器介绍设计器介绍l以前设计器(Designer)是一个独立的工具,但现在是QtCreator的一个组成部分l可视化窗体编辑器l拖放部件l安排布局l进行信号连接-设计器介绍设计器介绍sources*.cppexecutablesobject files*.oheaders*.hgeneratedmoc_*.cppuser interfac

27、es*.uiincludescompileslinkscompilesmocs-设计器介绍设计器介绍sources*.cppexecutablesobject files*.oheaders*.hgeneratedmoc_*.cppgeneratedui_*.huser interfaces*.uiincludescompileslinkscompilesmocsuic-使用代码使用代码#ifndef WIDGET_H#define WIDGET_H#include namespace Ui class Widget;class Widget:public QWidget Q_OBJECTpu

28、blic:Widget(QWidget*parent=0);Widget();private:Ui:Widget*ui;#endif/WIDGET_HUi:Widget类的前置声明一个 Ui:Widget 类指针ui,指向所有部件基本上一个标准的 QWidget 派生类-使用代码使用代码#include widget.h#include ui_widget.hWidget:Widget(QWidget*parent):QWidget(parent),ui(new Ui:Widget)ui-setupUi(this);Widget:Widget()delete ui;实例化类Ui:Widget

29、为 ui删除 ui对象调用函数 setupUi,生成所有父窗体(this)的子窗体部件-使用设计器使用设计器l基本工作流程粗略地放置部件在窗体上从里到外进行布局,添加必要的弹簧进行信号连接在代码中使用l在整个过程中不断修改编辑属性l实践创造完美!-使用设计器使用设计器拖放部件拖放部件粗略地放置部件在窗体上-使用设计器使用设计器l从里到外进行布局,添加必要的弹簧121.选中每一个 group box,2.应用垂直布局管理-使用设计器使用设计器l从里到外进行布局,添加必要的弹簧11.选中label(click),2.选中combobox(Ctrl+click)2-使用设计器使用设计器l从里到外进行

30、布局,添加必要的弹簧11.应用一个水平布局管理-使用设计器使用设计器l从里到外进行布局,添加必要的弹簧131.选中2个group box并进行布局管理,2.添加一个水平弹簧,3.将弹簧和按钮放置进一个布局管理中2-使用设计器使用设计器l进行信号连接(部件之间)12341.转到signals and slot 编辑模式,2.从一个部件拖放鼠标到另一个部件,3.选中signal and slot,4.在connections dock中查看结果-使用设计器使用设计器l进行信号连接(到你的代码中)1231.在widget editing 模式中 2.右击一个部件并选择 Go to slot.3.选择

31、一个信号来连接到你的代码-使用设计器使用设计器l在代码中使用l通过ui类成员使用所有部件class Widget:public QWidget .private:Ui:Widget*ui;void Widget:memberFunction()ui-pushButton-setText(.);-界面美化界面美化l1.子类化已有的控件类,重新实现paintEvent()、MouseEvent()等方法;l2.子类化QStyle,或者使用已经定义了的QWindowStyle等。l3.使用StyleSheet。-样式表样式表(StyleSheet)l所有的 QWidget 类都有一个 styleSh

32、eet 属性以支持跨平台样式l样式表是受启发自CSS的l它们可以用来进行高亮处理并进行许多小的修改l当然也可以用于用户界面的整体修改-样式表样式表l为一个单独的部件应用一个样式表的最简单方法是用设计器-样式表样式表l想为整个应用程序设定样式,可以使用 QApplication:setStyleSheetQLineEdit background-color:yellow QLineEdit#nameEdit background-color:yellow QTextEdit,QListView background-color:white;background-image:url(draft.p

33、ng);background-attachment:scroll;QGroupBox background-color:qlineargradient(x1:0,y1:0,x2:0,y2:1,stop:0#E0E0E0,stop:1#FFFFFF);border:2px solid gray;border-radius:5px;margin-top:1ex;使用图片在Designer的编辑器中建立这些选择一个类通过对象名选择一个对象-资源文件资源文件(qrc)l将图标放进一个资源文件中,Qt会将它们内嵌进可执行文件l避免调用多文件l不需要尝试确定每个特定安装风格下的图标的路径l一切都巧妙地在软

34、件构建系统中自适应l避免部署的时候出现文件丢失的错误l可以将任何东西添加进资源文件中,不仅仅是图标,但一般是不需要修改的文件。-资源文件资源文件(qrc)l可以轻松的在QtCreator中管理资源文件l在路径和文件名前添加:以使用资源l或者简单地在设计器的列表中选择一个图标QPixmap pm(:/images/logo.png);-Qt的国际化的国际化l1.确保应用程序是可翻译的:l 所用用户可见的字符串都使用tr()修饰l 根据不同的目标语言加载不同的qm的文件。l2.即使应用程序目前不需要翻译,也应该为以后的需求留出余地。-Qt国际化国际化步骤步骤l1.在代码中使用tr()修饰用户可见的

35、字符串;l2.lupdate提取需要翻译的字符串;lTRANSLATIONS=spreadsheet_cn.ts spreadsheet_en.ts l3.使用linguist工具翻译;l4.在程序开始时加载正确的qm文件。-Qt国际化国际化加载加载qm文件文件lint main(int argc,char*argv)l l QApplication app(argc,argv);l.lQTranslator appTranslator;l appTranslator.load(myapp_+QLocale:system().name(),qmPath);lapp.installTransla

36、tor(&appTranslator);l.lreturn app.exec();l -Qt国际化国际化动态语言切换动态语言切换l额外的工作:1.语言切换的途径(菜单、按钮等);2.在统一的方法(RetranslateUI()内处理用户可见字符串,并在语言切换时调用该方法。3.实现changeEvent(QEvent*event)方法lvoid JournalView:changeEvent(QEvent*event)l l if(event-type()=QEvent:LanguageChange)retranslateUi();lQTableWidget:changeEvent(event

37、);l-Qt简介Qt的使用Qt深入理解Qt的应用-QObject类类QObject是几乎所有Qt类和所有部件(widget)的基类。它包含很多组成Qt的机制事件信号和槽属性内存管理-QObject类类QObject 是大部分Qt 类的基类l例外的例子是:类需要作为轻量级的类,例如图元(graphical primitives)-QPen、QBrush。数据容器(QString,QList,QChar等)需要可复制的类,因为QObject类是无法被复制的。-QObject类类它们可以拥有一个名字(QObject:objectName)addButton,lineEdit_Password.它们被

38、放置在QObject实例的一个层次上它们可以有到其他 QObject 实例的联接“QObject 的实例是单独的!”-对象数据存储对象数据存储(1)lclass Personllprivate:l string mszName;/姓名 bool mbSex;/性别 int mnAge;/年龄l;c+中定义数据变量的一般方法:-/File name:person.h/声明私有数据成员类型struct PersonalDataPrivate;class Personpublic:Person();/constructorvirtual Person();/destructorvoid setAge

39、(const int);int 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:setAg

40、e(const int age)if(age!=d-mnAge)d-mnAge=age;int Person:getAge()return d-mnAge;-元对象系统元对象系统(Meta-Object System)lQObject 类 作为每一个需要利用元对象系统的类的基类。lQ_OBJECT 宏,定义在每一个类的私有数据段,用来启用元对象功能,比如,动态属性,信号和槽。l元对象编译器moc(the Meta Object Complier)-元对象系统元对象系统(Meta-Object System)元对象系统的功能:元数据(QObject:metaObject)类名(QObject:c

41、lassName)继承(QObject:inherits)属性(setProperty和 QObject:property)信号和槽(Signal and slot)普通信息(QObject:classInfo)国际化(tr(),QObject:trUtf8()-元对象系统元对象系统(Meta-Object System)sources*.cppexecutablesobject files*.oheaders*.h普通的普通的C+生成过程生成过程includescompileslinks-元数据通过元对象编译器(moc)在编译时组合在一起,元对象编译器用来处理Qt 的C+扩展。moc从头文件

42、里面获得数据。sources*.cppexecutablesobject files*.oheaders*.hgeneratedmoc_*.cppQt C+生成过程生成过程includescompileslinkscompilesmocs元对象系统(Meta-Object System)-元数据元数据moc 找什么?class MyClass:public QObject Q_OBJECT Q_CLASSINFO(author,John Doe)public:MyClass(const Foo&foo,QObject*parent=0);Foo foo()const;public slots:

43、void setFoo(const Foo&foo);signals:void fooChanged(Foo);private:Foo m_foo;Qt 关键字类的一般信息 Q_OBJECT宏,通常是第一步首先确认该类继承自 Qobject (可能是间接)-内省内省(Introspection)类在运行时了解它们自己的信息对实现脚本和动态语言的绑定l 有很好的支持。if(object-inherits(QAbstractItemView)QAbstractItemView*view=static_cast(widget);view-.enum CapitalsEnum Oslo,Helsink

44、i,Stockholm,Copenhagen;int index=object-metaObject()-indexOfEnumerator(CapitalsEnum);object-metaObject()-enumerator(index)-key(object-capital();能够实现动态转换而不需要运行时类型检查(RTTI)例子:它可以将枚举值转换成更容易阅读和保存的字符串元对象了解细节-属性属性(Properties)QObject有getter和setter函数属性命名策略:color,setColor对于布尔:isEnabled,setEnabledclass QLabel:

45、public QFrame Q_OBJECT Q_PROPERTY(QString text READ text WRITE setText)public:QString text()const;public slots:void setText(const QString&);Setter,返回空,将值当成唯一参数Getter,常量,返回值,没有参数-属性属性为什么使用setter 函数?可以验证设置对可能的变化作出反应void setMin(int newMin)if(newMin m_max)qWarning(Ignoring setMin(%d)as min max.,newMin);

46、return;.void setMin(int newMin).m_min=newMin;updateMinimum();-属性属性Properties为什么使用getter 函数?间接的属性QSize size()const return m_size;int width()const return m_size.width();-属性属性 Q_PROPERTY(type name READ getFunction WRITE setFunction RESET resetFunction NOTIFY notifySignal DESIGNABLE bool SCRIPTABLE bool

47、 STORED bool USER bool CONSTANT FINAL)-使用属性使用属性直接获取通过元信息和属性系统在运行时发现属性QString text=label-text();label-setText(Hello World!);QString text=object-property(text).toString();object-setProperty(text,Hello World);int QMetaObject:propertyCount();QMetaProperty QMetaObject:property(i);QMetaProperty:name/isCon

48、stant/isDesignable/read/write/.-动态属性动态属性在运行时给对象增加属性可以用来“标识”对象,等等。bool ret=object-setProperty(name,value);QObject:dynamicPropertyNames()const真:如果属性经过真:如果属性经过Q_PROPERTY 定义 假:如果只是动态增加假:如果只是动态增加返回一个动态属性的列表-创建自定义属性创建自定义属性class AngleObject:public QObject Q_OBJECT Q_PROPERTY(qreal angle READ angle WRITE se

49、tAngle)public:AngleObject(qreal angle,QObject*parent=0);qreal angle()const;void setAngle(qreal);private:qreal m_angle;宏,描述属性初始化值GetterSetter私有状态-创建自定义属性创建自定义属性AngleObject:AngleObject(qreal angle,QObject*parent):QObject(parent),m_angle(angle)qreal AngleObject:angle()const return m_angle;void AngleObj

50、ect:setAngle(qreal angle)m_angle=angle;doSomething();初始化值Getter 简单返回值。这里你可以计算复杂的值。更新内部状态,对变化作出反应。-自定义属性自定义属性-枚举枚举class AngleObject:public QObject Q_OBJECT Q_ENUMS(AngleMode)Q_PROPERTY(AngleMode angleMode READ.)public:enum AngleMode Radians,Degrees;.;普通枚举声明。宏通知Qt AngleMode 是一个枚举类型。属性使用枚举作为类型。-内存管理内存管

51、理QObject 可以有父对象和子对象当一个父对象被删除,它的子对象也同样被删除。QObject*parent=new QObject();QObject*child1=new QObject(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 删除 chi

52、ld1_1 和 child1_2-内存管理内存管理当需要实现视觉层级时使用到它。QDialog*parent=new QDialog();QGroupBox*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-使用方法使

53、用方法使用 this指针指向最高层父对象在栈上分配父对象空间void Widget:showDialog()Dialog dialog;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

54、 在作用范围结束时被删除-堆(堆(Heap)当使用 new 和 delete时,内存在堆中分配。堆内存空间必须通过 delete 完全释放,以防止内存泄漏。只要有需要,分配在堆上的对象可以一直存活下去。newdelete构造构造Construction析构析构Destruction-栈(栈(Stack)局部变量在栈上分配。栈变量超过作用范围时会自动释放。分配在栈中的对象在超出作用范围时总是会被析构。int a构造构造Construction析构析构Destruction-堆堆 和和 栈栈想要自动内存管理,只有父对象需要在栈上分配。MyMainWindowQApplicationint main

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

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

57、dget*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);-构造规范构造规范当创建自己的 Qobject时,需考虑总是允许父对象 parent 为 0(null)有一个只接受父对象的构造函数parent 是带默认值的第一个参数提供几种构造函数,避免

58、空值、无效值(e.g.QString()作为参数。-Qt简介Qt的使用Qt深入理解Qt的应用-基于基于Qt开发的软件开发的软件KDE(1)-基于基于Qt开发的软件开发的软件KDE(2)-基于基于Qt开发的软件开发的软件Google Earth-基于基于Qt开发的软件开发的软件MAYA-基于基于Qt开发的软件开发的软件-大吨位力矩限制器大吨位力矩限制器-基于基于Qt开发的软件开发的软件-塔机智能监控系塔机智能监控系统统-Qt资源推荐资源推荐1.C+GUI Programming with Qt 4,Second Edition,Prentice Hall 2.Qt AssisantQt帮助文档3.Qt Demo-后面内容直接删除就行资料可以编辑修改使用资料可以编辑修改使用资料仅供参考,实际情况实际分析The user can demonstrate on a projector or computer,or print the presentation and make it into a film to be used in a wider field结结束束不不是是是开是开始始-

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