《Qt入门培训教材(共111张).pptx》由会员分享,可在线阅读,更多相关《Qt入门培训教材(共111张).pptx(111页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、.Qt入门培训Qt introduction Qt简介Qt的使用Qt深入理解Qt的应用Qt简介什么是Qt?什么是Qt?原来用作用户界面开发,现可用作所有的开发例如:Databases, XML, WebKit, multimedia, networking, OpenGL, scripting, non-GUI.”Qt 是一个用C+编写的跨平台开发框架.”什么是Qt?Qt由模块构建QtCorePhononQtXmlPatternsQtXmlQtWebKitQtSvgQtSqlQtScriptQtOpenVGQtOpenGLQtNetworkQtMultimediaQtGui什么是QT?Qt用宏
2、(macros)和内省(introspection)扩展了C+所有的代码仍然是简明C + +foreach (int value, intList) QObject *o = new QPustButton;o-metaObject()-className(); / 返回 ”QPushButton”connect(button, SIGNAL(clicked(), window, SLOT(close();Qt的目的一次编写,到处编译根据不同平台的本地观感生成相应的本地应用简单地使用API,高开发效率,开放性,使用有趣Qt的历史19901991199419992001Haavard 和Eiri
3、k灵感闪现开始设计,并提出信号和槽的概念1993开发出Qt的第一个图形核心命名为Qt,并建立“奇趣科技”1995签订第一个合同,开始快速发展。1997Qt1.2发布, 并且用于开发KDE。Qt 2.0发布Qt 3.0发布。2005Qt 4.0发布2008Nokia收购奇趣科技Qt的跨平台桌面平台WindowsMac OS XLinux/Unix X11Qt的跨平台嵌入式平台Windows CESymbianMaemo嵌入式LinuxQt的授权LGPL 免费你的应用程序可以是开源的或者是不开源的对Qt的修改,必须反馈到社区GPL 免费你的应用程序必须是开源的对Qt的修改,必须反馈到社区商业的 收
4、费你的应用程序可以是不开源 的对Qt的修改,可以不开源Qt简介Qt的使用Qt深入理解Qt的应用Qt的代码结构-Hello WorldQt的代码结构-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 #include int main( int argc, char *argv ) QApplica
5、tion 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 #include int main( int argc, char *arg
6、v ) 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 Linguist4.Qt Assi
7、sant5.Qt Demos信号(Signal)与槽(Slot)初探QT提供的一种在对象间进行通讯的技术。动态地或松散地将事件和状态变化联系起来。信号和槽机制是使Qt运作的元素。信号(Signal)与槽(Slot)初探 类似于windows中的消息和消息响应都是通过C+类成员函数实现的信号和槽是通过连接实现相互关联的包含信号或槽的类必须从QObject继承信号(Signal)与槽(Slot)初探emit clicked();信号(Signal)与槽(Slot)初探private slots: void on_addButton_clicked(); void on_deleteButton_c
8、licked();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, Text:); if( !newText.isEmpty() ) u
9、i-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 salaryChanged(int newSalary);priva
10、te:int mySalary;emit salaryChanged(50);信号和槽的声明:信号(Signal)与槽(Slot)初探信号(Signal)与槽(Slot)初探 信号与槽机制只能用在继承于QObject的类。 槽可以返回值,但通过联接返回时不能有返回值,槽以一个普通的函数实现,可以作为普通函数调用。信号总是返回空,信号总是不必实现 一个信号可以连接到多个槽,但槽的调用顺序不确定。 信号和槽需要具有相同的参数列表;如果信号的参数比槽多,那么多余的参数会被忽略;如果参数列表不匹配,Qt会产生运行时错误信息信号和槽 vs 回调回调(callback)是一个函数指针,当一个事件发生时被调
11、用,任何函数都可以被安排作为回调。没有类型安全总是以直接调用方式工作信号和槽的方式更加动态一个更通用的机制更容易互连两个已存在的类相关类之间涉及更少的知识共享用户界面设计用户界面由特定的部件(widget)构建用户界面设计三种方式1.绝对定位(absolute positioning )最粗劣的方式对部件的大小、位置进行硬编码2. 手工布局(manual layout)绝对位置,但通过resizeEvent()方法改变大小3.布局管理器(layout managers)部件放置在布局管理器中,使界面更具弹性。布局管理器的优点?让部件适应内容让部件适应翻译变化让部件适应用户设置布局管理几种可用的
12、布局布局管理器和部件“协商”各个部件大小与位置弹簧可以用来填充空白处QGridLayoutQVBoxLayoutQHBoxLayout布局管理器示例对话框由多层的布局管理器和部件组成两种方式:代码实现,使用设计器注意:布局管理器并不是其管理的部件的父对象布局管理器代码实现 QVBoxLayout *outerLayout = new QVBoxLayout(this); QHBoxLayout *topLayout = new QHBoxLayout(); topLayout-addWidget(new QLabel(Printer:); topLayout-addWidget(c=new Q
13、ComboBox(); 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 QPu
14、shButton(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(); outerLayout-ad
15、dLayout(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); buttonLay
16、out-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); QHBoxL
17、ayout *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 QPushBut
18、ton(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 *groupLayout = new Q
19、HBoxLayout(); . 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); outerLayout-a
20、ddLayout(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(); . outerLayou
21、t-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-addWidg
23、et(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);Horizontal box, 包含 group boxes, vertical bo
24、xes, radio buttons布局管理器设计器可以使用设计器来建立同样的结构通用部件 Qt包含针对所有情形的大量通用部件; 第三方控件,如QWT 自定义控件尺寸(size)的策略布局管理器是在空间和其他布局管理器之间进行协调布局管理器提供布局结构水平布局和垂直布局网格布局部件则提供各个方向上的尺寸策略最大和最小尺寸尺寸的策略例子未完成!printerList-setSizePolicy(QSizePolicy:Expanding, QSizePolicy:Fixed)尺寸的策略每一个widget有一个大小的示意,它给出了各个方向上尺寸的策略Fixed 规定了widget的尺寸Minimu
25、m 规定了可能的最小值Maximum 规定可能的最大值Preferred 给出最好的值但不是必须的Expanding 同preferred,但希望增长MinimumExpanding 同minimum,但希望增长Ignored 忽略规定尺寸, widget得到尽量大的空间如果?2个 preferred 相邻1个 preferred, 1个 expanding2个 expanding 相邻空间不足以放置widget (fixed)关于尺寸的更多信息可用最大和最小属性更好地控制widget的大小maximumSize 最大可能尺寸minimumSize 最小可能尺寸ui-pushButton-se
26、tMinimumSize(100, 150);ui-pushButton-setMaximumHeight(250);伸缩因子控制缩放时,各控件的缩放比例。设计器介绍以前设计器(Designer)是一个独立的工具,但现在是QtCreator的一个组成部分可视化窗体编辑器拖放部件安排布局进行信号连接设计器介绍sources*.cppexecutablesobject files*.oheaders*.hgeneratedmoc_*.cppuser interfaces*.uiincludescompileslinkscompilesmocs设计器介绍sources*.cppexecutables
27、object files*.oheaders*.hgeneratedmoc_*.cppgeneratedui_*.huser interfaces*.uiincludescompileslinkscompilesmocsuic使用代码#ifndef WIDGET_H#define WIDGET_H#include namespace Ui class Widget;class Widget : public QWidget Q_OBJECTpublic: Widget(QWidget *parent = 0); Widget();private: Ui:Widget *ui;#endif /
28、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 为 ui删除 ui对象调用函数 setupUi, 生成所有父窗体 (this)的子窗体部件使用设计器基本工作流程 粗略地放置部件在
29、窗体上 从里到外进行布局,添加必要的弹簧 进行信号连接 在代码中使用在整个过程中不断修改编辑属性实践创造完美!使用设计器拖放部件拖放部件粗略地放置部件在窗体上使用设计器从里到外进行布局,添加必要的弹簧121. 选中每一个 group box, 2. 应用垂直布局管理使用设计器从里到外进行布局,添加必要的弹簧11. 选中label (click), 2. 选中combobox (Ctrl+click)2使用设计器从里到外进行布局,添加必要的弹簧11. 应用一个水平布局管理使用设计器从里到外进行布局,添加必要的弹簧131. 选中2个group box并进行布局管理, 2. 添加一个水平弹簧, 3.
30、 将弹簧和按钮放置进一个布局管理中2使用设计器进行信号连接(部件之间)12341. 转到signals and slot 编辑模式, 2. 从一个部件拖放鼠标到另一个部件, 3. 选中signal and slot, 4. 在connections dock中查看结果使用设计器进行信号连接(到你的代码中)1231. 在widget editing 模式中 2. 右击一个部件并选择 Go to slot.3. 选择一个信号来连接到你的代码使用设计器在代码中使用通过ui类成员使用所有部件class Widget : public QWidget .private: Ui:Widget *ui;vo
31、id Widget:memberFunction() ui-pushButton-setText(.);界面美化1.子类化已有的控件类,重新实现paintEvent()、MouseEvent()等方法;2.子类化QStyle,或者使用已经定义了的QWindowStyle等。3.使用StyleSheet。样式表(StyleSheet)所有的 QWidget 类都有一个 styleSheet 属性以支持跨平台样式样式表是受启发自CSS的它们可以用来进行高亮处理并进行许多小的修改当然也可以用于用户界面的整体修改样式表为一个单独的部件应用一个样式表的最简单方法是用设计器样式表想为整个应用程序设定样式,
32、可以使用 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: 0
33、 #E0E0E0, stop: 1 #FFFFFF); border: 2px solid gray; border-radius: 5px; margin-top: 1ex; 使用图片在Designer的编辑器中建立这些选择一个类通过对象名选择一个对象资源文件(qrc)将图标放进一个资源文件中,Qt会将它们内嵌进可执行文件避免调用多文件不需要尝试确定每个特定安装风格下的图标的路径一切都巧妙地在软件构建系统中自适应避免部署的时候出现文件丢失的错误可以将任何东西添加进资源文件中,不仅仅是图标,但一般是不需要修改的文件。资源文件(qrc)可以轻松的在QtCreator中管理资源文件在路径和文件名前
34、添加 : 以使用资源或者简单地在设计器的列表中选择一个图标QPixmap pm(:/images/logo.png);Qt的国际化1. 确保应用程序是可翻译的: 所用用户可见的字符串都使用tr()修饰 根据不同的目标语言加载不同的qm的文件。2. 即使应用程序目前不需要翻译,也应该为以后的需求留出余地。Qt国际化步骤1.在代码中使用tr()修饰用户可见的字符串;2.lupdate提取需要翻译的字符串;TRANSLATIONS = spreadsheet_cn.ts spreadsheet_en.ts 3.使用linguist工具翻译;4.在程序开始时加载正确的qm文件。Qt国际化加载qm文件i
35、nt main(int argc, char *argv) QApplication app(argc, argv); . QTranslator appTranslator; appTranslator.load(myapp_ + QLocale:system().name(), qmPath); app.installTranslator(&appTranslator); . return app.exec(); Qt国际化动态语言切换额外的工作:1.语言切换的途径(菜单、按钮等);2.在统一的方法(RetranslateUI()内处理用户可见字符串,并在语言切换时调用该方法。3.实现ch
36、angeEvent(QEvent *event) 方法void JournalView:changeEvent(QEvent *event) if (event-type() = QEvent:LanguageChange) retranslateUi(); QTableWidget:changeEvent(event); Qt简介Qt的使用Qt深入理解Qt的应用QObject类QObject是几乎所有Qt类和所有部件(widget)的基类。它包含很多组成Qt的机制事件信号和槽属性内存管理QObject类QObject 是大部分Qt 类的基类例外的例子是:类需要作为轻量级的类,例如图元(gra
37、phical primitives)-QPen、QBrush。数据容器(QString, QList, QChar等)需要可复制的类,因为QObject类是无法被复制的。QObject类它们可以拥有一个名字 (QObject:objectName)addButton, lineEdit_Password.它们被放置在QObject实例的一个层次上它们可以有到其他 QObject 实例的联接“QObject 的实例是单独的!”对象数据存储(1) class Personprivate: string mszName; / 姓名 bool mbSex; / 性别 int mnAge; / 年龄;c
38、+中定义数据变量的一般方法:/ File name: person.h/ 声明私有数据成员类型struct PersonalDataPrivate; class Personpublic: Person (); / constructorvirtual Person (); / destructorvoid setAge(const int);int getAge();private: PersonalDataPrivate* d;对象数据存储(2) Qt定义数据变量(Qt 2.x):/ File name: person.cppstruct PersonalDataPrivate / 定义私
39、有数据成员类型 string mszName; / 姓名 bool mbSex; / 性别 int mnAge; / 年龄;/ constructorPerson:Person () d = new PersonalDataPrivate;/ destructorPerson:Person () delete d;void Person:setAge(const int age) if (age != d-mnAge) d-mnAge = age;int Person:getAge() return d-mnAge;元对象系统(Meta-Object System) QObject 类 作为每
40、一个需要利用元对象系统的类的基类。Q_OBJECT 宏, 定义在每一个类的私有数据段,用来启用元对象功能,比如,动态属性,信号和槽。元对象编译器moc (the Meta Object Complier)元对象系统(Meta-Object System)元对象系统的功能:元数据(QObject:metaObject)类名 (QObject:className)继承 (QObject:inherits)属性(setProperty和 QObject:property)信号和槽(Signal and slot)普通信息(QObject:classInfo)国际化(tr(), QObject:trU
41、tf8()元对象系统(Meta-Object System)sources*.cppexecutablesobject files*.oheaders*.h普通的普通的C+生成过程生成过程includescompileslinks元数据通过元对象编译器(moc)在编译时组合在一起,元对象编译器用来处理Qt 的C+扩展。 moc从头文件里面获得数据。sources*.cppexecutablesobject files*.oheaders*.hgeneratedmoc_*.cppQt C+ 生成过程生成过程includescompileslinkscompilesmocs元对象系统(Meta-O
42、bject 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: void setFoo( const Foo &foo );signals: void fooChanged( Foo );private: Foo m_foo;Qt 关键字类的一般信息 Q_OBJECT宏, 通常是第一步首先确认该类继承自 Qobj
43、ect (可能是间接)内省(Introspection)类在运行时了解它们自己的信息对实现脚本和动态语言的绑定 有很好的支持。if (object-inherits(QAbstractItemView) QAbstractItemView *view = static_cast(widget); view-.enum CapitalsEnum Oslo, Helsinki, Stockholm, Copenhagen ;int index = object-metaObject()-indexOfEnumerator(CapitalsEnum);object-metaObject()-enum
44、erator(index)-key(object-capital();能够实现动态转换而不需要运行时类型检查( RTTI)例子:它可以将枚举值转换成更容易阅读和保存的字符串元对象了解细节属性(Properties)QObject有getter和setter函数属性命名策略: color, setColor对于布尔: isEnabled, setEnabledclass QLabel : public QFrame Q_OBJECT Q_PROPERTY(QString text READ text WRITE setText)public: QString text() const;publi
45、c slots: void setText(const QString &);Setter, 返回空,将值当成唯一参数Getter, 常量,返回值,没有参数属性为什么使用setter 函数?可以验证设置对可能的变化作出反应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();属性Properties为什么使用getter
46、函数?间接的属性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 STORED bool USER bool CONSTANT FINAL)使用属性直接获取通过元信息和属性系统在运行时发现属性QString text = label-text
47、();label-setText(Hello World!);QString text = object-property(text).toString();object-setProperty(text, Hello World);int QMetaObject:propertyCount();QMetaProperty QMetaObject:property(i);QMetaProperty:name/isConstant/isDesignable/read/write/.动态属性在运行时给对象增加属性可以用来“标识”对象,等等。bool ret = object-setProperty
48、(name, value);QObject:dynamicPropertyNames() const真:如果属性经过真:如果属性经过Q_PROPERTY 定义 假:如果只是动态增加假:如果只是动态增加返回一个动态属性的列表创建自定义属性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
49、(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 AngleObject:setAngle(qreal angle) m_angle = angle; doSomething();初始化值Getter 简单返回值。这里你可以计算复杂的值。更新内
50、部状态, 对变化作出反应。自定义属性 - 枚举class AngleObject : public QObject Q_OBJECT Q_ENUMS(AngleMode) Q_PROPERTY(AngleMode angleMode READ .)public: enum AngleMode Radians, Degrees; .;普通枚举声明。宏通知Qt AngleMode 是一个枚举类型。属性使用枚举作为类型。内存管理QObject 可以有父对象和子对象当一个父对象被删除,它的子对象也同样被删除。QObject *parent = new QObject();QObject *child1